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).