连接
连接字符串
mongosh "mongodb://localhost:27017" mongosh "mongodb://user:pass@host:27017/mydb" mongosh "mongodb+srv://user:[email protected]/mydb"
驱动连接(Node.js)
const { MongoClient } = require('mongodb'); const client = new MongoClient(uri); await client.connect(); const db = client.db('mydb');
数据库与集合
数据库操作
show dbs use mydb db.dropDatabase()
集合操作
db.createCollection("users") show collections db.users.drop()
固定集合
db.createCollection("logs", { capped: true, size: 10485760, max: 5000 })
CRUD 操作
插入
db.users.insertOne({ name: "Alice", age: 30 }) db.users.insertMany([ { name: "Bob", age: 25 }, { name: "Carol", age: 28 } ])
查询
db.users.findOne({ name: "Alice" }) db.users.find({ age: { $gte: 25 } }) db.users.find({}, { name: 1, _id: 0 }) db.users.find().sort({ age: -1 }).limit(10)
更新
db.users.updateOne( { name: "Alice" }, { $set: { age: 31, city: "Boston" } } ) db.users.updateMany( { active: false }, { $set: { archived: true } } )
删除
db.users.deleteOne({ name: "Alice" }) db.users.deleteMany({ active: false })
替换与 Upsert
db.users.replaceOne( { name: "Alice" }, { name: "Alice", age: 32, city: "NYC" } ) db.users.updateOne( { email: "[email protected]" }, { $set: { name: "Alice" } }, { upsert: true } )
查询运算符
比较
$eq / $ne等于 / 不等于
$gt / $gte大于 / 大于等于
$lt / $lte小于 / 小于等于
$in / $nin在数组中 / 不在数组中
逻辑
$and所有条件都必须匹配
$or至少一个条件匹配
$not取反条件
$exists字段是否存在(true/false)
$regex正则表达式匹配
更新运算符
$set设置字段值
$unset移除字段
$inc数值递增
$push / $pull添加 / 移除数组元素
$addToSet不存在时添加到数组
$rename重命名字段
聚合
管道阶段
$match过滤文档(类似 WHERE)
$group分组并聚合
$project重构文档(类似 SELECT)
$sort排序结果
$limit / $skip分页
$lookup与另一集合左外连接
$unwind将数组拆解为多个文档
聚合示例
db.orders.aggregate([ { $match: { status: "completed" } }, { $group: { _id: "$customer_id", total: { $sum: "$amount" }, count: { $sum: 1 } }}, { $sort: { total: -1 } }, { $limit: 10 } ])
索引
创建与删除
db.users.createIndex({ email: 1 }, { unique: true }) db.users.createIndex({ name: 1, age: -1 }) db.users.createIndex({ location: "2dsphere" }) db.users.dropIndex("email_1")
索引类型
Single field单字段索引({ name: 1 })
Compound多字段索引({ a: 1, b: -1 })
Text全文检索({ field: 'text' })
2dsphere地理空间查询
TTL到期后自动删除文档
索引信息
db.users.getIndexes() db.users.find({ name: "Alice" }).explain()
Schema 设计
嵌入 vs 引用
Embed1:1 或 1:少,数据一起读取
Reference1:多,数据独立访问
Embed子文档很少超过 16 MB
Reference多对多关系
Schema 验证
db.createCollection("users", { validator: { $jsonSchema: { bsonType: "object", required: ["name", "email"], properties: { name: { bsonType: "string" }, email: { bsonType: "string" } }}}})
副本集
副本集概念
Primary接收所有写入
Secondary从主节点复制,可提供读服务
Arbiter参与选举,不存储数据
副本集命令
rs.initiate() rs.add("mongo2:27017") rs.addArb("mongo3:27017") rs.status() rs.conf()
常见模式
事务
const session = client.startSession(); session.startTransaction(); await db.collection("accounts").updateOne( { _id: 1 }, { $inc: { bal: -100 } }, { session }); await db.collection("accounts").updateOne( { _id: 2 }, { $inc: { bal: 100 } }, { session }); await session.commitTransaction();
批量写入
db.users.bulkWrite([ { insertOne: { document: { name: "Dan" } } }, { updateOne: { filter: { name: "Alice" }, update: { $set: { age: 31 } } }}, { deleteOne: { filter: { name: "old" } } } ])
变更流
const stream = db.collection("orders") .watch([{ $match: { "fullDocument.status": "new" } }]); stream.on("change", (change) => { console.log(change.fullDocument); });
mongosh 命令
Shell 辅助命令
show dbs列出数据库
show collections列出当前库的集合
db.stats()数据库统计信息
db.collection.stats()集合统计信息
db.collection.countDocuments({})文档计数
db.collection.distinct('field')字段的唯一值
导出与导入
mongoexport --db=mydb --collection=users \ --out=users.json mongoimport --db=mydb --collection=users \ --file=users.json mongodump --db=mydb --out=/backup/ mongorestore --db=mydb /backup/mydb/