Summary
This post will demonstrate equivalent Create, Read, Update and Delete (CRUD) commands in MongoDB and Redis. I provide examples from Mongo's shell (mongosh), Redis CLI, node-redis client lib, and redis-py client lib.
Sample Data Set
Below is a snippet of the JSON document that is used in all the examples.
[
{
"item": "journal",
"qty": 25,
"tags": ["blank", "red"],
"dim_cm": [ 14, 21 ],
"size": {
"h": 14,
"w": 21,
"uom": "cm"
},
"status": "E"
},
{
"item": "notebook",
"qty": 50,
"tags": ["red", "blank"],
"dim_cm": [ 14, 21 ],
"size": {
"h": 14,
"w": 21,
"uom": "cm"
},
"status": "E"
},
Create Operation
Mongo Shell
db.inventory.insertMany([
{ _id: 1, item: "journal", qty: 25, tags: ["blank", "red"], dim_cm: [ 14, 21 ], size: { h: 14, w: 21, uom: "cm" }, status: "E" },
{ _id: 2, item: "notebook", qty: 50, tags: ["red", "blank"], dim_cm: [ 14, 21 ], size: { h: 14, w: 21, uom: "cm" }, status: "E" },
{ _id: 3, item: "paper", qty: 100, tags: ["red", "blank", "plain"], dim_cm: [ 14, 21 ], size: { h: 19, w: 22.85, uom: "cm" },status: "B" },
{ _id: 4, item: "planner", qty: 75, tags: ["blank", "red"], dim_cm: [ 22.85, 30 ], status: "C" },
{ _id: 5, item: "postcard", qty: 45, tags: ["blue"], dim_cm: [ 10, 15.25 ], status: "D" }
])
db.inventory.createIndexes([
{qty: 1},
{item: 1},
{tags: 1},
{size: 1},
{status: 1}
])
Redis CLI
JSON.SET inventory:1 . '{"item":"journal","qty":25,"tags":["blank","red"],"dim_cm":[14,21],"size":{"h":14,"w":21,"uom":"cm"},"status":"E"}'
JSON.SET inventory:2 . '{"item":"notebook","qty":50,"tags":["red","blank"],"dim_cm":[14,21],"size":{"h":14,"w":21,"uom":"cm"},"status":"E"}'
JSON.SET inventory:3 . '{"item":"paper","qty":100,"tags":["red","blank","plain"],"dim_cm":[14,21],"size":{"h":19,"w":22.85,"uom":"cm"},"status":"B"}'
JSON.SET inventory:4 . '{"item":"planner","qty":75,"tags":["blank","red"],"dim_cm":[22.85,30],"status":"C"}'
JSON.SET inventory:5 . '{"item":"postcard","qty":45,"tags":["blue"],"dim_cm":[10,15.25],"status":"D"}'
FT.CREATE inventoryIdx ON JSON PREFIX 1 inventory: SCHEMA $.item AS item TEXT $.qty AS qty NUMERIC $.tags.* AS tags TAG $.dim_cm[0] AS dim_cm_0 NUMERIC $.dim_cm[1] AS dim_cm_1 NUMERIC $.status AS status TEXT $.size.h AS sizeh NUMERIC $.size.w AS sizew NUMERIC $.size.uom AS sizeuom TEXT
node-redis (Javascript)
for (let item of dataset) {
await client.json.set(`inventory:${itemNum++}`, '.', item);
}
await client.ft.create('inventoryIdx', {
'$.item': {
type: SchemaFieldTypes.TEXT,
AS: 'item'
},
'$.qty': {
type: SchemaFieldTypes.NUMERIC,
AS: 'qty'
},
'$.tags.*': {
type: SchemaFieldTypes.TAG,
AS: 'tags'
},
'$.dim_cm[0]': {
type: SchemaFieldTypes.NUMERIC,
AS: 'dim_cm_0'
},
'$.dim_cm[1]': {
type: SchemaFieldTypes.NUMERIC,
AS: 'dim_cm_1',
},
'$.status': {
type: SchemaFieldTypes.TEXT,
AS: 'status'
},
'$.size.h': {
type: SchemaFieldTypes.NUMERIC,
AS: 'sizeh'
},
'$.size.w': {
type: SchemaFieldTypes.NUMERIC,
AS: 'sizew'
},
'$.size.uom': {
type: SchemaFieldTypes.TEXT,
AS: 'sizeuom'
}
}, {
ON: 'JSON',
PREFIX: 'inventory:'
});
redis-py (Python)
itemNum = 1
for dataItem in dataset:
client.json().set(f'inventory:{itemNum}', '.', dataItem)
itemNum += 1
index_def = IndexDefinition(
index_type=IndexType.JSON,
prefix=['inventory:']
)
schema = ( TextField('$.item', as_name='item'),
NumericField('$.qty', as_name='qty'),
TagField('$.tags.*', as_name='tags'),
NumericField('$.dim_cm[0]', as_name='dim_cm_0'),
NumericField('$.dim_cm[1]', as_name='dim_cm_1'),
TextField('$.status', as_name='status'),
NumericField('$.size.h', as_name='sizeh'),
NumericField('$.size.w', as_name='sizew'),
TextField('$.size.uom', as_name='sizeuom')
)
client.ft('inventoryIdx').create_index(schema,definition=index_def)
Read Operation - Compound Query
Mongo Shell
db.inventory.find( {
status: "E",
$or: [ { qty: { $lt: 30 } }, { item: /^pa/ } ]
} )
Redis CLI
FT.SEARCH inventoryIdx '(@status:E) ((@qty:[-inf (30])|(@item:pa*))'
node-redis (Javascript)
await client.ft.search('inventoryIdx', '(@status:E) ((@qty:[-inf (30])|(@item:pa*))');
redis-py (Python)
client.ft('inventoryIdx').search(Query('(@status:E) ((@qty:[-inf (30])|(@item:pa*))')).docs
Update Operation
Mongo Shell
db.inventory.update(
{ _id: 2 },
{
$inc: { qty: 5 },
$set: {
item: "spiral notebook",
}
}
)
Redis CLI
MULTI
JSON.NUMINCRBY inventory:2 '.qty' 5
JSON.SET inventory:2 .item '"spiral notebook"'
EXEC
node-redis (Javascript)
await client
.multi()
.json.numIncrBy('inventory:2', '.qty', 5)
.json.set('inventory:2', '.item', 'spiral notebook' )
.exec();
redis-py (Python)
pipe = client.pipeline()
pipe.json().numincrby('inventory:2', '.qty', 5)
pipe.json().set('inventory:2', '.item', 'spiral notebook')
pipe.execute()
Delete Operation
Mongo Shell
db.inventory.deleteOne( { "_id" : 2 } )
Redis CLI
JSON.DEL inventory:2
node-redis (Javascript)
await client.json.del('inventory:2');
redis-py (Python)
client.json().delete('inventory:2')
Source (with more examples)
https://github.com/Redislabs-Solution-Architects/docdevdemo
Copyright ©1993-2024 Joey E Whelan, All rights reserved.