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.