Ju Zi's blog

Back

概述#

MongoDB 是一种流行的 NoSQL 数据库,以其灵活的文档存储方式和强大的查询功能而著称。本文将系统介绍 MongoDB 的常用查询语句,帮助开发者快速掌握数据库操作。

插入数据#

插入单条文档#

db.collection.insertOne({
  name: "张三",
  age: 28,
  email: "zhangsan@example.com"
})
javascript

插入多条文档#

db.collection.insertMany([
  { name: "李四", age: 32, department: "技术部" },
  { name: "王五", age: 25, department: "市场部" },
  { name: "赵六", age: 30, department: "产品部" }
])
javascript

查询数据#

基础查询#

逻辑运算符#

元素查询#

// 存在字段
db.users.find({ email: { $exists: true } })

// 字段不为空
db.users.find({ age: { $exists: true, $ne: null } })

// 数组包含元素
db.users.find({ hobbies: "编程" })

// 数组长度
db.users.find({ hobbies: { $size: 3 } })
javascript

正则表达式#

// 模糊查询
db.users.find({ name: // })

// 忽略大小写
db.users.find({ name: { $regex: /zhang/i } })

// 复杂正则
db.users.find({ email: { $regex: /^user.*@example\.com$/i } })
javascript

更新数据#

更新单条文档#

更新多条文档#

替换文档#

db.users.updateOne(
  { _id: ObjectId("507f1f77bcf86cd799439011") },
  { $set: { name: "张三", age: 29, email: "newemail@example.com" } }
)
javascript

删除数据#

删除单条文档#

// 根据条件删除
db.users.deleteOne({ _id: ObjectId("507f1f77bcf86cd799439011") })

// 删除第一条匹配文档
db.users.deleteOne({ status: "inactive" })
javascript

删除多条文档#

// 删除所有匹配文档
db.users.deleteMany({ status: "inactive" })

// 删除整个集合
db.users.deleteMany({})
javascript

排序和分页#

排序查询#

// 按字段升序
db.users.find({}).sort({ age: 1 })

// 按字段降序
db.users.find({}).sort({ age: -1 })

// 多字段排序
db.users.find({}).sort({ department: 1, age: -1 })

// 随机排序
db.users.find({}).sort({ $natural: -1 })
javascript

分页查询#

// 限制返回数量
db.users.find({}).limit(10)

// 跳过指定数量
db.users.find({}).skip(20)

// 组合使用
db.users.find({}).limit(10).skip(20)

// 常用分页
const page = 1;
const pageSize = 10;
db.users.find({}).skip((page - 1) * pageSize).limit(pageSize)
javascript

聚合查询#

基础聚合#

// 统计文档数量
db.users.countDocuments({ age: { $gte: 18 } })

// 去重
db.users.distinct("department")

// 字段求和
db.users.aggregate([
  { $match: { age: { $gte: 25 } } },
  { $group: { _id: "$department", count: { $sum: 1 } } }
])
javascript

复杂聚合#

数组操作#

优化建议#

索引使用#

查询优化技巧#

// 1. 使用投影减少数据传输
db.users.find({}, { name: 1, email: 1 })

// 2. 避免全表扫描
db.users.find({ status: "active" })  // 而不是 db.users.find({})

// 3. 合理使用索引
db.users.createIndex({ name: 1, email: 1 })

// 4. 使用 explain 查看查询计划
db.users.find({ name: "张三" }).explain("executionStats")

// 5. 分页避免深度分页
db.users.find({}).limit(10).skip(100000)  // 性能差
db.users.find({}).sort({ _id: 1 }).limit(10).skip(100000)  // 性能好
javascript

常见问题#

性能问题#

// 1. 使用 countDocuments 代替 count()
db.users.countDocuments({})  // 推荐
db.users.count({})  // 已废弃

// 2. 避免使用 $or 查询
db.users.find({ $or: [...] })  // 性能较差

// 3. 使用 explain 分析查询
db.users.find({}).explain()
javascript

数据类型问题#

// 字符串转 ObjectId
const objectId = ObjectId("507f1f77bcf86cd799439011")

// Date 类型处理
db.users.updateOne(
  { _id: objectId },
  { $set: { createdAt: new Date() } }
)

// 数字类型
db.users.find({ age: NumberInt("28") })
javascript

批量操作优化#

参考资源#

更新日志#

  • 2025-03-21: 初始版本,包含基础 CRUD 操作和聚合查询
MongoDB 常用查询语句
https://juzzi.qzz.io/blog/devel/mongodb-query-commands
Author Ju Zi
Published at March 21, 2025
Comment seems to stuck. Try to refresh?✨