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/docdevdemoCopyright ©1993-2024 Joey E Whelan, All rights reserved.