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