MongoDB基础语法 #
一、MongoDB Shell #
1.1 Mongosh简介 #
MongoDB Shell(mongosh)是MongoDB的官方命令行工具,用于与MongoDB实例交互。
bash
# 启动Mongosh
mongosh
# 连接指定数据库
mongosh mydb
# 连接字符串
mongosh "mongodb://localhost:27017/mydb"
1.2 Shell界面 #
text
Current Mongosh Log ID: 65f1a2b3c4d5e6f7g8h9i0j1
Connecting to: mongodb://127.0.0.1:27017
Using MongoDB: 7.0.x
Using Mongosh: 2.0.x
For mongosh info see: https://docs.mongodb.com/mongodb-shell/
test>
1.3 常用快捷键 #
| 快捷键 | 功能 |
|---|---|
| Tab | 自动补全 |
| ↑/↓ | 历史命令 |
| Ctrl+C | 取消当前输入 |
| Ctrl+L | 清屏 |
| Ctrl+D | 退出Shell |
二、基本命令 #
2.1 数据库操作 #
javascript
// 显示所有数据库
show dbs
show databases
// 切换/创建数据库
use mydb
// 显示当前数据库
db
// 删除数据库
db.dropDatabase()
2.2 集合操作 #
javascript
// 显示所有集合
show collections
show tables
// 创建集合
db.createCollection("users")
// 删除集合
db.users.drop()
2.3 文档操作 #
javascript
// 插入文档
db.users.insertOne({ name: "John", age: 25 })
// 查询文档
db.users.find()
db.users.findOne()
// 更新文档
db.users.updateOne(
{ name: "John" },
{ $set: { age: 26 } }
)
// 删除文档
db.users.deleteOne({ name: "John" })
2.4 索引操作 #
javascript
// 创建索引
db.users.createIndex({ name: 1 })
// 查看索引
db.users.getIndexes()
// 删除索引
db.users.dropIndex("name_1")
三、命名规范 #
3.1 数据库命名 #
javascript
// 推荐命名
use my_app_db // 小写,下划线分隔
use ecommerce // 小写,单词
// 不推荐
use My-App-DB // 大写、连字符
use 123db // 数字开头
use db.test // 包含特殊字符
命名规则:
| 规则 | 说明 |
|---|---|
| 字符 | 只能使用ASCII字母、数字、下划线 |
| 大小写 | 推荐全部小写 |
| 长度 | 最多64字节 |
| 保留 | admin, local, config是保留数据库 |
3.2 集合命名 #
javascript
// 推荐命名
db.users // 小写,复数形式
db.order_items // 下划线分隔
db.log_2024_01 // 时间分区
// 不推荐
db.Users // 大写
db.order-items // 连字符
db.user // 单数形式
命名规则:
| 规则 | 说明 |
|---|---|
| 字符 | 不能包含$、空字符串、null |
| 前缀 | 不能以system.开头 |
| 长度 | 最多255字节 |
| 点号 | 可以使用点号表示命名空间 |
3.3 字段命名 #
javascript
// 推荐命名
{
"userName": "John", // 驼峰命名
"created_at": ISODate(), // 下划线命名
"isActive": true // 布尔字段加is前缀
}
// 不推荐
{
"user-name": "John", // 连字符
"123field": "value", // 数字开头
"db.field": "value" // 包含点号(嵌套字段除外)
}
命名规则:
| 规则 | 说明 |
|---|---|
| 字符 | 不能包含$、.(点号) |
| 长度 | 无限制,但不宜过长 |
| 保留 | _id是保留字段 |
3.4 命名示例 #
javascript
// 用户集合
db.users.insertOne({
_id: ObjectId(),
username: "john_doe",
email: "john@example.com",
firstName: "John",
lastName: "Doe",
isActive: true,
createdAt: ISODate(),
updatedAt: ISODate()
})
// 订单集合
db.orders.insertOne({
_id: ObjectId(),
orderNumber: "ORD-2024-001",
userId: ObjectId(),
items: [
{ productId: ObjectId(), quantity: 2, price: 99.99 }
],
totalAmount: 199.98,
status: "pending",
createdAt: ISODate()
})
// 日志集合
db.system_logs.insertOne({
_id: ObjectId(),
level: "info",
message: "User login successful",
service: "auth-api",
timestamp: ISODate(),
metadata: {
userId: ObjectId(),
ip: "192.168.1.1"
}
})
四、数据类型 #
4.1 基本类型 #
javascript
// 字符串
{ name: "John" }
// 数字
{ age: 25 } // 32位整数
{ price: 99.99 } // 64位浮点数
{ balance: NumberLong("9007199254740993") } // 64位整数
{ decimal: NumberDecimal("123.45") } // 高精度小数
// 布尔值
{ isActive: true }
{ isDeleted: false }
// 日期
{ createdAt: new Date() }
{ timestamp: ISODate("2024-01-01T00:00:00Z") }
// null
{ middleName: null }
// 对象ID
{ _id: ObjectId() }
{ userId: ObjectId("507f1f77bcf86cd799439011") }
4.2 复杂类型 #
javascript
// 数组
{ tags: ["mongodb", "nosql", "database"] }
{ scores: [85, 90, 78, 92] }
// 嵌套文档
{
address: {
street: "123 Main St",
city: "Beijing",
country: "China"
}
}
// 二进制数据
{ data: BinData(0, "aGVsbG8=") }
// 正则表达式
{ pattern: /john/i }
// JavaScript代码
{ func: function() { return 1; } }
4.3 特殊类型 #
javascript
// 时间戳
{ ts: Timestamp(1234567890, 1) }
// 最小值/最大值
{ min: MinKey }
{ max: MaxKey }
// 未定义
{ field: undefined }
五、操作符 #
5.1 查询操作符 #
javascript
// 比较操作符
{ age: { $eq: 25 } } // 等于
{ age: { $ne: 25 } } // 不等于
{ age: { $gt: 20 } } // 大于
{ age: { $gte: 20 } } // 大于等于
{ age: { $lt: 30 } } // 小于
{ age: { $lte: 30 } } // 小于等于
{ age: { $in: [20, 25, 30] } } // 在列表中
{ age: { $nin: [20, 25, 30] } } // 不在列表中
// 逻辑操作符
{ $and: [{ age: { $gt: 20 } }, { status: "active" }] }
{ $or: [{ age: { $lt: 20 } }, { age: { $gt: 60 } }] }
{ $not: { age: { $gt: 30 } } }
{ $nor: [{ age: { $lt: 20 } }, { status: "inactive" }] }
// 元素操作符
{ name: { $exists: true } } // 字段存在
{ age: { $type: "number" } } // 类型检查
// 数组操作符
{ tags: { $all: ["mongodb", "nosql"] } } // 包含所有元素
{ tags: { $size: 3 } } // 数组长度
{ tags: { $elemMatch: { $gt: 80 } } } // 元素匹配
5.2 更新操作符 #
javascript
// 字段操作符
{ $set: { name: "John", age: 26 } } // 设置字段
{ $unset: { middleName: "" } } // 删除字段
{ $inc: { age: 1 } } // 增加数值
{ $mul: { price: 1.1 } } // 乘法
{ $rename: { "oldName": "newName" } } // 重命名字段
{ $setOnInsert: { createdAt: new Date() } } // 插入时设置
// 数组操作符
{ $push: { tags: "new" } } // 添加元素
{ $push: { scores: { $each: [1, 2, 3] } } } // 添加多个元素
{ $pop: { tags: 1 } } // 删除最后一个元素
{ $pull: { tags: "old" } } // 删除匹配元素
{ $addToSet: { tags: "unique" } } // 添加唯一元素
六、脚本编写 #
6.1 基本脚本 #
javascript
// script.js
db = db.getSiblingDB("mydb")
db.users.drop()
db.users.insertMany([
{ name: "John", age: 25, city: "Beijing" },
{ name: "Jane", age: 28, city: "Shanghai" },
{ name: "Bob", age: 30, city: "Guangzhou" }
])
print("Inserted " + db.users.countDocuments() + " documents")
6.2 执行脚本 #
bash
# 方式1:在Shell中加载
mongosh --file script.js
# 方式2:在Shell中使用load
mongosh
> load("script.js")
# 方式3:使用eval执行
mongosh --eval "db.users.find().pretty()"
6.3 批量操作 #
javascript
// 批量插入
const bulkOps = []
for (let i = 0; i < 10000; i++) {
bulkOps.push({
insertOne: {
document: {
name: `user_${i}`,
age: Math.floor(Math.random() * 50) + 18,
createdAt: new Date()
}
}
})
}
db.users.bulkWrite(bulkOps, { ordered: false })
6.4 错误处理 #
javascript
try {
db.users.insertOne({
_id: ObjectId(),
name: "John",
email: "john@example.com"
})
print("Document inserted successfully")
} catch (error) {
print("Error: " + error.message)
}
七、常用函数 #
7.1 聚合函数 #
javascript
// 计数
db.users.countDocuments({ age: { $gt: 20 } })
// 去重
db.users.distinct("city")
// 分组统计
db.users.aggregate([
{ $group: { _id: "$city", count: { $sum: 1 } } }
])
7.2 辅助函数 #
javascript
// 格式化输出
db.users.find().pretty()
// 限制结果
db.users.find().limit(10)
// 跳过结果
db.users.find().skip(10)
// 排序
db.users.find().sort({ age: -1 })
// 投影
db.users.find({}, { name: 1, age: 1, _id: 0 })
7.3 管理函数 #
javascript
// 查看集合统计
db.users.stats()
// 查看索引大小
db.users.dataSize()
// 压缩集合
db.runCommand({ compact: "users" })
// 重建索引
db.users.reIndex()
八、配置管理 #
8.1 查看配置 #
javascript
// 查看服务器状态
db.serverStatus()
// 查看数据库统计
db.stats()
// 查看集合统计
db.users.stats()
// 查看当前操作
db.currentOp()
8.2 设置参数 #
javascript
// 设置日志级别
db.setLogLevel(1, "command")
// 设置Profiling级别
db.setProfilingLevel(1, 100)
// 查看Profiling状态
db.getProfilingStatus()
九、最佳实践 #
9.1 查询优化 #
javascript
// 使用投影减少返回字段
db.users.find({}, { name: 1, email: 1 })
// 使用limit限制结果
db.users.find().limit(100)
// 使用索引
db.users.find({ name: "John" }).hint({ name: 1 })
// 避免使用$where
// 不推荐
db.users.find({ $where: "this.age > 20" })
// 推荐
db.users.find({ age: { $gt: 20 } })
9.2 写入优化 #
javascript
// 批量插入
db.users.insertMany([...])
// 无序插入(更快)
db.users.insertMany([...], { ordered: false })
// 批量更新
db.users.bulkWrite([
{ updateOne: { filter: { _id: 1 }, update: { $set: { status: "active" } } } },
{ updateOne: { filter: { _id: 2 }, update: { $set: { status: "active" } } } }
])
9.3 安全建议 #
javascript
// 使用参数化查询(避免注入)
const name = req.body.name
db.users.find({ name: name })
// 不要直接拼接字符串
// 不安全
const query = "{ name: '" + name + "' }"
db.users.find(JSON.parse(query))
十、总结 #
MongoDB语法要点:
| 类别 | 要点 |
|---|---|
| 命名 | 小写、下划线、见名知意 |
| 数据类型 | 文档、数组、嵌套文档 |
| 操作符 | 查询、更新、聚合 |
| 脚本 | 批量操作、错误处理 |
常用命令速查:
javascript
// 数据库
show dbs // 显示数据库
use mydb // 切换数据库
db.dropDatabase() // 删除数据库
// 集合
show collections // 显示集合
db.createCollection("users") // 创建集合
db.users.drop() // 删除集合
// 文档
db.users.find() // 查询
db.users.insertOne({...}) // 插入
db.users.updateOne({...}) // 更新
db.users.deleteOne({...}) // 删除
下一步,让我们学习MongoDB数据类型!
最后更新:2026-03-27