Chris Mendez in For Developers, MongoDB

MongoDB cheatsheet

I can never seem to remember all the commands I need to build a simple Express API app using Mongo.

If anyone is reading this, please share how I can make this post more useful.

BASICS

Show Databases

List all of the available databases.

show dbs  

Clear the console

cls  

Show Collections

show collections  

Show data in a database>collection and make it look pretty

db.system.users.find().pretty()  

Create a database called Customers

If the database has been created, Mongo will simply switch you in.

use customers  

CREATING STUFF

Create a collection

db.createCollection('customers')  

Create a user

What's unique about MongoDB is that you can insert Javascript into the database without any issues.

//Create a user
db.createUser({  
    "user": "chrisaiv",
    "pwd": "password",
    "roles": [
        { role: "clusterAdmin", db: "admin" },
        { role: "readAnyDatabase", db: "admin" },
        "readWrite"
        ]
    },
    { w: "majority", wtimeout: 5000 }
)

INSERTING DATA

Insert data into a user

use customers  

Add a customer with a first and last name

db.customers.insert({  
    first_name: "chris",
    last_name:  "aiv" 
})

Append a lot of data into a customer

db.customers.insert({  
    first_name: "Peter",
    age: 32,
    address: {
        street: "120 Main St",
        city: "Chicago",
        state: "Illinois",
        zip: "38475"
    },
    phone: {
        home: "5555555555",
        work: "4444444444",
        mobile: "3333333333"
    },
    services: [
        {
            service_id: "time warner"
        },
        {
            service_id: "pge"
        },
        {
            service_id: "moviepass"
        }
    ],
    services_count: 3
});

Append data to a customer

db.customers.insert({  
    first_name: "Billy",
    last_name:  "Corgan",
    gender: "m"
})

Insert a Date

db.customers.insert({  
    first_name: "Bo",
    last_name:  "Diddley",
    birthdate: new Date('December 30, 1928')
})

Insert multiple customers in one query

db.customers.insert([  
    {
    first_name: "Jimmy",
    last_name:  "Hendrix"
    },
    {
    first_name: "Jimmy",
    last_name:  "Page"
    },
    {
    first_name: "Kurt",
    last_name:  "Cobain"
    },
    {
    first_name: "Adrian",
    last_name:  "Belew"
    },
    {
    first_name: "Billy",
    last_name:  "Corgan"
    }
])

FINDING DATA

Find services from person on first name

db.customers.find({ first_name: "Peter"}, { services: 1})  

Find services by name only

db.customers.find({ first_name: "Peter"}, { "services.service_id": 1})  

Find me a single record of "billy" and only return the first name

db.customers.findOne(  
    { first_name: /^billy$/i },
    { first_name: 1 }
)

Find all the males in the database

db.customers.find({  
    gender: "male"
})

Find males who either have m or male for gender and firstname is case insensitive

db.customers.find({  
    gender: /(m|male)/i, first_name: /^billy$/i 
})

UPDATING DATA

Destructive Update > !!! BE VERY VERY CAREFUL

db.customers.update(  
    { first_name: "Jimmy" },
    { last_name:  "Hendrix"}
)

Gentel Update > Use this technique for updates

db.customers.update(  
    { last_name: /^hendrix$/i },
    { $set: { first_name: "Jimmy" } }
)

Increment a value in a field

db.customers.update(  
    { first_name: "Billy" },
    { $inc: { age: 1 }
    }
)

Update or Insert a field using an object ID

db.customers.update(  
    { _id: ObjectId("5669f625a0a8005d8c7aae31") },
    {
        $set: {
            gender: "male",
            age: 50,
            birthdate: new Date("Aug 20, 1985")
        }
    }
)

Update a field using someones first name

db.customers.update(  
    { first_name: "Jimmy" },
    {
        $set: {
            gender: "male",
            age: 50,
            birthdate: new Date("Aug 20, 1985")
        }
    },
    { upsert: true }
)

Add to an existing document

db.customers.update(  
    { first_name: "Jimmy" },
    { $push: {
        services: {
            service_id: 'hosting windows',
            service_name: "windows hosting"
        }
        }
    }
)

REMOVING DATA

Remove a field

db.customers.update(  
    { last_name: "Page" },
    { 
        $unset: { age: 1 }
    }
)

Remove a customer (NEVER DO THIS)

//!!! DO NOT US THIS
db.customers.remove(  
    //!!! DO NOT US THIS
    { first_name: "Billy"}, true 
)

Remove any customer above the age of 31

db.customers.remove(  
    { age: { $gt: 31 } }
    , true
)

DELETING DATA

Delete a collection

db.customers.drop()  

SEARCH

How to search an array within an object

{
  _id: 1,
  name: { first: 'John', last: 'Backus' },
  birth: new Date('Dec 03, 1924'),
  death: new Date('Mar 17, 2007'),
  contribs: [ 'Fortran', 'ALGOL', 'Backus-Naur Form', 'FP' ],
  awards: [
            { award: 'National Medal',
              year: 1975,
              by: 'NSF' },
            { award: 'Turing Award',
              year: 1977,
              by: 'ACM' }
          ]
}
db.users.find({awards: {$elemMatch: {award:'National Medal', year:1975}}})  

How to query child objects

{"name" : "Spain", "cities" : [ { "name" : "Madrid" }, { "name" : null } ] }
{"name" : "France" }

Answer

Retrieve only the queried element in object array

I'd like to get the document (Document 1) only with the array that contains color=red:

{  
 "_id":ObjectId("562e7c594c12942f08fe4192"),
   "shapes":[  
      {  
         "shape":"square",
         "color":"blue"
      },
      {  
         "shape":"circle",
         "color":"red"
      }
   ]
},
{  
   "_id":ObjectId("562e7c594c12942f08fe4193"),
   "shapes":[  
      {  
         "shape":"square",
         "color":"black"
      },
      {  
         "shape":"circle",
         "color":"green"
      }
   ]
}

3 Possible Answers: $elemMatch projection operator, $filter aggregation operator, $unwind operator, $redact aggregation (good for large datasets).