Database Manual

MongoDB Cheat SheetMongoDB备忘单

This cheat sheet has quick reference commands for mongosh to get you connected and running CRUD operations as quickly as possible. For more information, see the mongosh documentation.这个备忘单有mongosh的快速参考命令,可以让你尽快连接并运行CRUD操作。有关更多信息,请参阅mongosh文档

Note

This cheat sheet includes common MongoDB commands, but is not comprehensive. See Database Commands and mongosh Methods for full lists.此备忘单包括常见的MongoDB命令,但并不全面。有关完整列表,请参阅数据库命令mongosh方法

Connect and Authenticate连接并验证

Connect

// Omit password if you want to prompt for it
mongosh --host <host> --port <port> --authenticationDatabase admin -u <user> -p <pwd>

mongosh "mongodb://<user>:<password>@192.168.1.1:27017"

mongosh "mongodb://192.168.1.1:27017"

mongosh "mongodb+srv://cluster-name.abcde.mongodb.net/<dbname>" --apiVersion
1 --username <username> # MongoDB Atlas

Connection Information

db.getMongo()               // get connection object
db.getMongo().getDBs() // list databases
db.hello()
db.runCommand({ping: 1}) // test connection
db.listCommands()
db.adminCommand({buildInfo: 1}) // MongoDB build information

Create User and Authenticate

use admin
// Create, drop, or authenticating users
db.createUser({"user": "root", "pwd": passwordPrompt(), "roles": ["root"]})
db.dropUser("root")
db.auth( "user", passwordPrompt() )

Common Helpers

Show Databases

show dbs
db // prints the current database

Switch Database

use <database_name>

Show Collections

show collections

Run JavaScript File

load("myScript.js")

CRUD Operations

Create

db.coll.insertOne({name: "Max"})
db.coll.insertMany([{name: "Max"}, {name:"Alex"}]) // ordered bulk insert
db.coll.insertMany([{name: "Max"}, {name:"Alex"}], {ordered: false}) // unordered bulk insert
db.coll.insertOne({date: ISODate()})
db.coll.insertOne({name: "Max"}, {"writeConcern": {"w": "majority", "wtimeout": 5000}})

Read

Basic Find Operations

db.coll.findOne() // returns a single document
db.coll.find() // returns a cursor that displays 20 results, use "it" to display more
db.coll.find().pretty()
db.coll.find({name: "Max", age: 32}) // implicit logical "AND".
db.coll.find({date: ISODate("2020-09-25T13:57:17.180Z")})
db.coll.find({name: "Max", age: 32}).explain("executionStats") // or "queryPlanner" or "allPlansExecution"
db.coll.distinct("name")

Count Operations

// Count
db.coll.countDocuments({age: 32}) // $count aggregation alias that returns an accurate count
db.coll.estimatedDocumentCount() // uses collection metadata to estimate the document count

Comparison Operators

// Comparison
db.coll.find({"year": {$gt: 1970}})
db.coll.find({"year": {$gte: 1970}})
db.coll.find({"year": {$lt: 1970}})
db.coll.find({"year": {$lte: 1970}})
db.coll.find({"year": {$ne: 1970}})
db.coll.find({"year": {$in: [1958, 1959]}})
db.coll.find({"year": {$nin: [1958, 1959]}})

Logical Operators

// Logical
db.coll.find({name:{$not: {$eq: "Max"}}})
db.coll.find({$or: [{"year" : 1958}, {"year" : 1959}]})
db.coll.find({$nor: [{price: 1.99}, {sale: true}]})
db.coll.find({
$and: [
{$or: [{qty: {$lt :10}}, {qty :{$gt: 50}}]},
{$or: [{sale: true}, {price: {$lt: 5 }}]}
]
})

Element Operators

// Element
db.coll.find({name: {$exists: true}})
db.coll.find({"zipCode": {$type: 2 }})
db.coll.find({"zipCode": {$type: "string"}})

Aggregation Pipeline

// Aggregation Pipeline
db.coll.aggregate([
{$match: {status: "A"}},
{$group: {_id: "$cust_id", total: {$sum: "$amount"}}},
{$sort: {total: -1}}
])

Text Search

// Create text index for search
db.coll.createIndex({ title: "text", content: "text" })

// Basic text search
db.coll.find({$text: {$search: "cake"}})

// Text search queries
db.coll.find({ $text: { $search: "mongodb database" } })
db.coll.find({ $text: { $search: "\"exact phrase\"" } })
db.coll.find({ $text: { $search: "mongodb -database" } }) // exclude "database"

// Text search with scores
db.coll.find({$text: {$search: "cake"}}, {score: {$meta: "textScore"}}).sort({score: {$meta: "textScore"}})

Geospatial Queries

// Create geospatial indexes
db.places.createIndex({ location: "2dsphere" }) // For GeoJSON
db.places.createIndex({ location: "2d" }) // For legacy coordinates

// Find locations near a point
db.places.find({
location: {
$near: {
$geometry: { type: "Point", coordinates: [-73.9857, 40.7484] },
$maxDistance: 1000 // meters
}
}
})

// Find locations within a polygon
db.places.find({
location: {
$geoWithin: {
$geometry: {
type: "Polygon",
coordinates: [[
[-74.0059, 40.7128],
[-74.0059, 40.7589],
[-73.9352, 40.7589],
[-73.9352, 40.7128],
[-74.0059, 40.7128]
]]
}
}
}
})

Regular Expressions

// Regex
db.coll.find({name: /^Max/}) // regex: starts by letter "M"
db.coll.find({name: /^Max$/i}) // regex case insensitive

Array Operations

// Array
db.coll.find({tags: {$all: ["Realm", "Charts"]}})
db.coll.find({field: {$size: 2}}) // can't be indexed, so instead store the size of the array & update it
db.coll.find({results: {$elemMatch: {product: "xyz", score: {$gte: 8}}}})

Projections

// Projections
db.coll.find({"x": 1}, {"actors": 1}) // actors + _id
db.coll.find({"x": 1}, {"actors": 1, "_id": 0}) // actors
db.coll.find({"x": 1}, {"actors": 0, "summary": 0}) // all but "actors" and "summary"

Sort, Skip, Limit

// Sort, skip, limit
db.coll.find({}).sort({"year": 1, "rating": -1}).skip(10).limit(3)

Read Concern

// Read Concern
db.coll.find().readConcern("majority")

Update

Basic Update Operations

db.coll.updateOne({"_id": 1}, {$set: {"year": 2016, name: "Max"}})
db.coll.updateOne({"_id": 1}, {$unset: {"year": 1}})
db.coll.updateOne({"_id": 1}, {$rename: {"year": "date"} })
db.coll.updateOne({"_id": 1}, {$inc: {"year": 5}})
db.coll.updateOne({"_id": 1}, {$mul: {price: NumberDecimal("1.25"), qty: 2}})
db.coll.updateOne({"_id": 1}, {$min: {"imdb": 5}})
db.coll.updateOne({"_id": 1}, {$max: {"imdb": 8}})
db.coll.updateOne({"_id": 1}, {$currentDate: {"lastModified": true}})
db.coll.updateOne({"_id": 1}, {$currentDate: {"lastModified": {$type: "timestamp"}}})

Array Update Operations

// Array
db.coll.updateOne({"_id": 1}, {$push :{"array": 1}})
db.coll.updateOne({"_id": 1}, {$pull :{"array": 1}})
db.coll.updateOne({"_id": 1}, {$addToSet :{"array": 2}})
db.coll.updateOne({"_id": 1}, {$pop: {"array": 1}}) // last element
db.coll.updateOne({"_id": 1}, {$pop: {"array": -1}}) // first element
db.coll.updateOne({"_id": 1}, {$pullAll: {"array" :[3, 4, 5]}})
db.coll.updateOne({"_id": 1}, {$push: {"scores": {$each: [90, 92]}}})
db.coll.updateOne({"_id": 2}, {$push: {"scores": {$each: [40, 60], $sort: 1}}}) // array sorted
db.coll.updateOne({"_id": 1, "grades": 80}, {$set: {"grades.$": 82}})
db.coll.updateMany({}, {$inc: {"grades.$[]": 10}})
db.coll.updateMany({}, {$set: {"grades.$[element]": 100}}, {multi: true, arrayFilters: [{"element": {$gte: 100}}]})

FindOneAndUpdate

// FindOneAndUpdate
db.coll.findOneAndUpdate({"name": "Max"}, {$inc: {"points": 5}}, {returnNewDocument: true})

Upsert

// Upsert
db.coll.updateOne({"_id": 1}, {$set: {item: "apple"}, $setOnInsert: {defaultQty: 100}}, {upsert: true})

Replace

// Replace
db.coll.replaceOne({"name": "Max"}, {"firstname": "Maxime", "surname": "Beugnet"})

Write Concern

// Write concern
db.coll.updateMany({}, {$set: {"x": 1}}, {"writeConcern": {"w": "majority", "wtimeout": 5000}})

Batch and Bulk Operations

// Update many documents efficiently
db.coll.updateMany({status: "pending"}, {$set: {status: "processed"}})

// Delete many documents
db.coll.deleteMany({status: "old"})

// Insert many documents efficiently
db.coll.insertMany([
{name: "user1", status: "active"},
{name: "user2", status: "active"},
{name: "user3", status: "active"}
])

// Bulk operation for mixed insert, update, and delete operations
// Ordered by default, executed serially. If unordered, MongoDB
// executes operations in parallel.
db.coll.bulkWrite([
{ insertOne: { document: { name: "Alice", age: 30 } } },
{ updateOne: { filter: { name: "Bob" }, update: { $set: { age: 25 } } } },
{ deleteOne: { filter: { name: "Charlie" } } }
], ordered: false)

Delete

db.coll.deleteOne({name: "Max"})
db.coll.deleteMany({name: "Max"}, {"writeConcern": {"w": "majority", "wtimeout": 5000}})
db.coll.deleteMany({}) // WARNING! Deletes all documents, but not the collection or its index definitions
db.coll.findOneAndDelete({"name": "Max"})

Databases and Collections

Database Information

db.getName()
db.getSiblingDB("dbname")
db.stats()

Create Collection with Schema Validation

// Create collection with a $jsonschema
db.createCollection("contacts", {
validator: {$jsonSchema: {
bsonType: "object",
required: ["phone"],
properties: {
phone: {
bsonType: "string",
description: "Required. Must be a string."
},
email: {
bsonType: "string",
pattern: "@mongodb\.com$",
description: "String that matches the regular expression."
},
status: {
enum: [ "Unknown", "Incomplete" ],
description: "Must be one of the preceding enum values."
}
}
}}
})

Import or Export Data

Important

These are MongoDB database tool commands, not mongosh methods. Run them in your system terminal.

// Import JSON data
mongoimport --db mydb --collection mycoll --file data.json

// Export to JSON
mongoexport --db mydb --collection mycoll --out data.json

// Import CSV data
mongoimport --db mydb --collection mycoll --type csv --headerline --file data.csv

// Create database dump
mongodump --db mydb --out backup/

// Restore from dump
mongorestore backup/

Drop

Warning

The following commands delete data permanently. Use them with caution, especially in a production environment.

db.coll.drop()    // removes the collection and its index definitions
db.dropDatabase() // removes the database. USE CAUTION.

Other Collection Functions

db.getCollectionNames()
db.getCollectionInfos()
db.printCollectionStats()

db.coll.stats() // collection statistics including size, count, and indexes
db.coll.storageSize() // collection data storage size, in bytes
db.coll.totalIndexSize() // total size of all collection indexes
db.coll.totalSize() // total size of collection data and indexes
db.coll.validate({full: true})
db.coll.renameCollection("new_coll", true) // rename collection. WARNING: "true" drops any existing collection with the same name

Indexes

List Indexes

db.coll.getIndexes()
db.coll.getIndexKeys()

Create Indexes

Index Types

// Index Types
db.coll.createIndex({"name": 1}) // single field index
db.coll.createIndex({"name": 1, "date": 1}) // compound index
db.coll.createIndex({foo: "text", bar: "text"}) // text index
db.coll.createIndex({"$**": "text"}) // wildcard text index
db.coll.createIndex({"userMetadata.$**": 1}) // wildcard index
db.coll.createIndex({"loc": "2d"}) // 2d index
db.coll.createIndex({"loc": "2dsphere"}) // 2dsphere index
db.coll.createIndex({"_id": "hashed"}) // hashed index

Index Options

// Index Options
db.coll.createIndex({"lastModifiedDate": 1}, {expireAfterSeconds: 3600}) // TTL index
db.coll.createIndex({"name": 1}, {unique: true})
db.coll.createIndex({"name": 1}, {partialFilterExpression: {age: {$gt: 18}}}) // partial index
db.coll.createIndex({"name": 1}, {collation: {locale: 'en', strength: 1}}) // case insensitive index with strength 1 or 2
db.coll.createIndex({"name": 1 }, {sparse: true})

Drop Indexes

db.coll.dropIndex("name_1")

Hide or Unhide Indexes

db.coll.hideIndex("name_1")
db.coll.unhideIndex("name_1")

Transactions and Change Streams

Transactions

// Start a session for transactions
session = db.getMongo().startSession()
session.startTransaction()

try {
// Perform multiple operations
session.getDatabase("mydb").mycollection.insertOne({name: "Alice"})
session.getDatabase("mydb").mycollection.updateOne({name: "Bob"}, {$set: {status: "updated"}})

// Commit the transaction
session.commitTransaction()
} catch (error) {
// Abort the transaction on error
session.abortTransaction()
throw error
} finally {
session.endSession()
}

Change Streams

watchCursor = db.coll.watch( [ { $match : {"operationType" : "insert" } } ] )

while (!watchCursor.isExhausted()){
if (watchCursor.hasNext()){
print(tojson(watchCursor.next()));
}
}

Server Management and Replication

Server Commands

db.serverStatus()
db.hostInfo()
db.shutdownServer()

db.fsyncLock() // flush pending operations and lock the server
db.fsyncUnlock() // reduce the lock count on the server

Replica Sets

db.getReplicationInfo()
db.printReplicationInfo()

rs.status()
rs.initiate({"_id": "RS1",
members: [
{ _id: 0, host: "mongodb1.net:27017" },
{ _id: 1, host: "mongodb2.net:27017" },
{ _id: 2, host: "mongodb3.net:27017" }]
rs.add("mongodb4.net:27017")
rs.addArb("mongodb5.net:27017")
rs.remove("mongodb1.net:27017")
rs.conf()
rs.hello()
rs.printReplicationInfo()
rs.printSecondaryReplicationInfo()
rs.reconfig(config)
rs.reconfigForPSASet(memberIndex, config, { options } )
db.getMongo().setReadPref('secondaryPreferred')
rs.stepDown(20, 5) // (stepDownSecs, secondaryCatchUpPeriodSecs)

Sharded Clusters

db.printShardingStatus()
sh.status()
sh.addShard("rs1/mongodb1.example.net:27017")
sh.enableSharding("mydb")
sh.disableSharding("mydb.coll")
sh.shardCollection("mydb.coll", {zipcode: 1})
sh.moveChunk("mydb.coll", { zipcode: "53187" }, "shard0019")
sh.splitChunk("mydb.coll", { "shardKey": value })
sh.splitAt("mydb.coll", {x: 70})
sh.splitFind("mydb.coll", {x: 70})
sh.updateZoneKeyRange("mydb.coll", {state: "NY", zip: MinKey }, { state: "NY", zip: MaxKey }, "NY")
sh.removeRangeFromZone("mydb.coll", {state: "NY", zip: MinKey }, { state: "NY", zip: MaxKey })
sh.addShardToZone("shard0000", "NYC")
sh.removeShardFromZone("shard0000", "NYC")
sh.startAutoMerger()
sh.stopAutoMerger()
sh.enableAutoMerger()
sh.disableAutoMerger()

Documents and Fields

ObjectIds

// ObjectId
ObjectId() // generates a new ObjectId
ObjectId("507f1f77bcf86cd799439011") // creates ObjectId from string
ObjectId().getTimestamp() // returns the timestamp portion
ObjectId().toString() // converts to string representation
ObjectId().valueOf() // returns the string value

Data Types and Type Checking

// BSON data types
NumberInt(42) // 32-bit integer
NumberLong(42) // 64-bit integer
NumberDecimal("42.42") // 128-bit decimal

// Date operations
new Date() // current date/time
ISODate() // current date/time in ISO format
ISODate("2023-01-01") // specific date

// Binary data
BinData(0, "base64encodedstring")

// Regular expressions
/<pattern>/<flags>

// Check data types
typeof value
db.coll.find({field: {$type: "string"}})

Performance and Optimization

// Query performance analysis
db.coll.find({name: "John"}).explain()
db.coll.find({name: "John"}).explain("executionStats")

// Collection statistics
db.coll.stats()
db.coll.totalIndexSize()
db.coll.storageSize()

// Database profiling and logging
db.setProfilingLevel(2) // Profile all operations
db.setProfilingLevel(1, 100) // Profile slow operations (>100ms)
db.setProfilingLevel(0) // Turn off profiling
db.getProfilingStatus()

// View profile data
db.system.profile.find().sort({ts: -1}).limit(5)

// Current operations
db.currentOp()
db.killOp(operationId)

// Server and database stats
db.serverStatus()
db.stats()