Skip to main content

MongoDB Cheatsheet

Mongosh

  • use mongosh to interact with mongodb
$ docker exec -it <mongodb_container_id> /bin/bash
# mongosh --username root

Basic CRUD

// show all databases
show dbs

// create or use a database
use blog

// show all collections
db.getCollectionNames()

// Find One
db.users.findOne(filter)

// Find Many
db.users.findMany(filter)

// Insert One
db.users.insertOne({name:"Logan1"}

// Insert Many
db.users.insertMany([
  {name:"Logan1"},
  {name:"Logan2"}
])

// Update One
db.users.updateOne(
  {name:"Logan1"},
  {$set:{age:101, gender:"M"}}
)

// Update Many
db.users.updateMany(
  {age:101},
  {$set:{discount:"Old People Discount"}}
)

// Replace One
db.users.replaceOne(
  {name: 'Logan3'},
  {name: 'Logan3', age: 104}
)

// Upsert (update or insert)
// Available for updateOne, replaceOne, and updateMany
db.users.replaceOne(
  {name: 'Logan3'},
  {$set: {name: 'Logan3', age: 104}},
  {upsert: true}
)

// Delete One
db.users.deleteOne({name: "Logan1"})

// Delete Many
db.users.deleteMany({age: {$gt: 50, $lt:100}})

Advance Query

// Query AND

// Query OR

// Query IN

// Query Regex

// Query embeded documents





Filters

// To create a filter:Filter:
var filter = {name:"name": "Logan1"Logan2"}

// To apply the filter:
db.users.findOne(filter)

// Result:Query AND
db.users.find({name:"Logan2",age:101})
_id:db.users.find({$and: ObjectId('6759b32bb0f5c192b5fc0421')[{name:"Logan2"}, name: 'Logan1' {age:101}]}
// SQL:

select * from users where name = "Logan1"Logan2" and age = 101

// ToQuery findOR
db.users.find({$or: [{name:"Logan1"},{name:"Logan2"}]}

select * from users where name="Logan1" or name="Logan2"

// Query IN
db.users.find({name:{$in:["Logan2", "Logan3"]}})

select * from user where name containsin ("Logan2", "o":Logan3")

filter// =Query =Regex
db.users.find({name:{$regex:/o/}}
db.users.find(filter)
// Result:
[
  { _id: ObjectId('6759b359b0f5c192b5fc0422'), name: 'Logan2' },
  { _id: ObjectId('6759b359b0f5c192b5fc0423'), name: 'Logan3' }
]
// SQL:

select * from users where name like '%o%'

// ToQuery matchembeded documents
db.inventory.insertMay([
  {item:"Notebook", size:{w:10, h:10, unit:"cm"}},
  {item:"Paer", size:{w:10: h:2, unit:"in"}},
])

  // ** Match one offield ** //
db.users.inventory.find({name:"size.unit":"cm"})

  // ** Match entir embedded document **//
  // ** Field order matters!! ** //
db.inventory.find({$in:size:{w:10, [h:10, unit:"Logan2", "Logan3"]cm"}})

// Result:Query Array
db.inventory.insertMany([
   { _id:item: ObjectId('6759b359b0f5c192b5fc0422')"journal", name:qty: 'Logan2'25, tags: ["blank", "red"], dim_cm: [ 14, 21 ] },
   { _id:item: ObjectId('6759b359b0f5c192b5fc0423')"notebook", name:qty: 'Logan3'50, tags: ["red", "blank"], dim_cm: [ 14, 21 ] }
]}

  // SQL:** This is like mathcing embedded document ** //
  // ** Needs exact match, including orders ** //
db.inventory.find({tags:["red", "blank"]})

  // ** Find documents that contains all **//
db.inventory.find({tags:{$all:["red", "blank"]}}
select * from users where nametags in ("Logan2",include "Logan3")red" and tags include "blank"

  // To** patchFind aone document:match db.users.updateOne({name: 'Logan2'}, {$set: {age: 101}})** //
Result:
db.inventory.find({
  acknowledged: true,
  insertedId: null,
  matchedCount: 1,
  modifiedCount: 1,
  upsertedCount: 0
}
// SQL:
update users set age=101 where name =tags: "Logan2"

// To replace a document
db.users.replaceOne({name: 'Logan3'}, {name: 'Logan3', age: 104})
// Result:
{
  acknowledged: true,
  insertedId: null,
  matchedCount: 1,
  modifiedCount: 1,
  upsertedCount: 0
}
// SQL:
delete users where name = "Logan3"
insert into users (name, age) values ("Logan3", 104)

// Now see the updated documents
db.users.find()
// Result:
[
  {
    _id: ObjectId('6759b359b0f5c192b5fc0422'),
    name: 'Logan2',
    age: 101
  },
  {
    _id: ObjectId('6759b359b0f5c192b5fc0423'),
    name: 'Logan3',
    age: 104
  }
]

// To match using "$and"
db.users.find({name: "Logan2", age: 101})
// Or equivalently:
db.users.find({$and: [{name: 'Logan2'}, {age: 101}]red"})
// SQL:
select * from users where name=tags include "Logan2" and age=101red"

  // To** matchOne usingelement "$or"can be greater than 15, and another be less than 20 ** //
db.users.inventory.find({dim_cm:{$or:gt:15, [{name:$lt: 'Logan2'}, {name: 'Logan3'}]20}})

  // SQL:** selectUse $elemMatch to specify multiple criteria on the same elment
db.inventory.find({dim_cm: {$elemMatch: {$gt:15, $lt: 20}}})

  // ** Specify index of element, first element by grearter than 25 ** //
db.inventory.find({"dim_cm.0": {$gt:25}})

  // ** Specify size of array ** //
db.inventory.find({tags: {$size: 3}})





// Select target fields:
db.inventory.find({status:"A"}, {item:1, status:1})
SELECT _id, item, status from usersinventory whereWHERE name=status = "Logan2"A"

ordb.inventory.find( name={ status: "Logan3"A" }, { item: 1, status: 1, _id: 0 } )
SELECT item, status from inventory WHERE status = "A"

db.inventory.find( { status: "A" }, { status: 0, instock: 0 } )
// Returns all fields except for status and instock

// Select target fields in embedded documents:
db.inventory.find(
   { status: "A" },
   { item: 1, status: 1, "size.uom": 1 }
)

// Select last element from the instock array with $slice
db.inventory.find(
  { status: "A" },
  { item: 1, status: 1, instock: { $slice: -1 }}
)

// Aggregation:
db.inventory.find(
   { },
   {
      _id: 0,
      item: 1,
      status: {
         $switch: {
            branches: [
               {
                  case: { $eq: [ "$status", "A" ] },
                  then: "Available"
               },
               {
                  case: { $eq: [ "$status", "D" ] },
                  then: "Discontinued"
               },
            ],
            default: "No status found"
         }
      },
      area: {
         $concat: [
            { $toString: { $multiply: [ "$size.h", "$size.w" ] } },
            " ",
            "$size.uom"
         ]
      },
      reportNumber: { $literal: 1 }
   }
)

// OUTPUT:
[
   {
      item: 'journal',
      status: 'Available',
      area: '294 cm',
      reportNumber: 1
   },
   {
      item: 'planner',
      status: 'Discontinued',
      area: '685.5 cm',
      reportNumber: 1
   },
   {
      item: 'notebook',
      status: 'Available',
      area: '93.5 in',
      reportNumber: 1
   }
]