MongoDB basics.
Install / connect
docker run -d -p 27017:27017 --name mongo mongo:7
mongosh
mongosh "mongodb://user:pass@host:27017/db"
Database / collection
use myapp // create/switch
show dbs
show collections
db.users.drop()
db.dropDatabase()
Insert
db.users.insertOne({ name: "Alice", age: 30 })
db.users.insertMany([
{ name: "Bob", age: 25 },
{ name: "Carol", age: 35 },
])
Find
db.users.find()
db.users.find({ age: 30 })
db.users.find({ age: { $gt: 25 } })
db.users.find({ tags: "admin" })
db.users.findOne({ _id: ObjectId("...") })
db.users.find().count()
db.users.find().sort({ age: -1 }).limit(10)
db.users.find({ name: /^A/i })
db.users.find({ age: { $in: [25, 30, 35] } })
db.users.find({}, { name: 1, _id: 0 }) // projection
Operators
$eq $ne $gt $gte $lt $lte
$in $nin
$and $or $not $nor
$exists $type
$regex $text
$elemMatch $size $all
$mod $expr
Update
db.users.updateOne({ _id: ... }, { $set: { age: 31 } })
db.users.updateMany({ active: true }, { $inc: { logins: 1 } })
db.users.replaceOne({ _id: ... }, { name: "New", age: 25 })
// Upsert
db.users.updateOne({ email: "..." }, { $set: { ... } }, { upsert: true })
Update operators
$set $unset $inc $mul $rename
$push $pull $pop $addToSet
$min $max $currentDate
$pullAll
Delete
db.users.deleteOne({ _id: ... })
db.users.deleteMany({ age: { $lt: 18 } })
Indexes
db.users.createIndex({ email: 1 }, { unique: true })
db.users.createIndex({ name: 1, age: -1 })
db.users.createIndex({ "$**": "text" }) // text search
db.users.getIndexes()
db.users.dropIndex("email_1")
explain
db.users.find({ email: "..." }).explain("executionStats")
Aggregation
db.orders.aggregate([
{ $match: { status: "completed" } },
{ $group: { _id: "$user_id", total: { $sum: "$amount" } } },
{ $sort: { total: -1 } },
{ $limit: 10 },
])
ObjectId
ObjectId() // new
ObjectId("507f...")
ObjectId().getTimestamp()
Bulk write
db.users.bulkWrite([
{ insertOne: { document: { name: "X" } } },
{ updateOne: { filter: { _id: ... }, update: { $set: { ... } } } },
{ deleteOne: { filter: { _id: ... } } },
])
Common mistakes
- $set vs $push confusion.
- Missing index on filter fields.
- Updating nested without $set.
- No
uniquefor email/username. _idas ObjectId by default; check before string compare.
Read this next
If you want my Mongo setup, it’s at rajpoot.dev .
Building something AI-, backend-, or data-heavy and want a second pair of eyes? I do consulting and freelance work — see my projects and ways to reach me at rajpoot.dev .