Skip to content

MongoDB 查询文档

MongoDB 提供了强大的查询功能,可以精确查找、过滤和检索文档。

基本查询

find() 方法

javascript
db.collection.find(query, projection)

查询所有文档

javascript
// 查询所有文档
db.users.find()

// 美化输出
db.users.find().pretty()

查询单个文档

javascript
// 返回第一个匹配的文档
db.users.findOne()

// 带条件的单个查询
db.users.findOne({ name: "张三" })

条件查询

精确匹配

javascript
// 查询 name 为 "张三" 的文档
db.users.find({ name: "张三" })

// 查询多个条件(AND)
db.users.find({ name: "张三", age: 25 })

比较操作符

javascript
// 大于 $gt
db.users.find({ age: { $gt: 25 } })

// 大于等于 $gte
db.users.find({ age: { $gte: 25 } })

// 小于 $lt
db.users.find({ age: { $lt: 30 } })

// 小于等于 $lte
db.users.find({ age: { $lte: 30 } })

// 不等于 $ne
db.users.find({ age: { $ne: 25 } })

// 范围查询
db.users.find({ age: { $gte: 20, $lte: 30 } })

多值查询

javascript
// $in - 匹配数组中任意值
db.users.find({ age: { $in: [20, 25, 30] } })

// $nin - 不匹配数组中任何值
db.users.find({ age: { $nin: [20, 25] } })

逻辑操作符

AND 条件

javascript
// 隐式 AND
db.users.find({ name: "张三", age: 25, city: "北京" })

// 显式 $and
db.users.find({
  $and: [
    { name: "张三" },
    { age: 25 }
  ]
})

OR 条件

javascript
// $or
db.users.find({
  $or: [
    { name: "张三" },
    { name: "李四" }
  ]
})

// 年龄小于20或大于60
db.users.find({
  $or: [
    { age: { $lt: 20 } },
    { age: { $gt: 60 } }
  ]
})

NOT 条件

javascript
// $not
db.users.find({ age: { $not: { $gt: 25 } } })

NOR 条件

javascript
// $nor - 所有条件都不满足
db.users.find({
  $nor: [
    { name: "张三" },
    { age: 25 }
  ]
})

数组查询

查询包含元素的数组

javascript
// 查询 tags 包含 "技术" 的文档
db.articles.find({ tags: "技术" })

// 查询包含多个元素的数组
db.articles.find({ tags: { $all: ["技术", "MongoDB"] } })

查询数组长度

javascript
// 查询 tags 有2个元素的文档
db.articles.find({ tags: { $size: 2 } })

查询数组特定位置

javascript
// 查询 tags 第一个元素是 "技术"
db.articles.find({ "tags.0": "技术" })

嵌套文档查询

点符号查询

javascript
// 查询 address.city 为 "北京"
db.users.find({ "address.city": "北京" })

// 查询嵌套字段
db.users.find({ "contacts.phone": "13800138000" })

查询整个嵌套文档

javascript
db.users.find({
  address: {
    city: "北京",
    street: "长安街"
  }
})

结果处理

限制返回字段

javascript
// 只返回 name 和 age 字段(_id 默认返回)
db.users.find({}, { name: 1, age: 1 })

// 排除某些字段
db.users.find({}, { password: 0, secret: 0 })

// 只返回 name 字段,排除 _id
db.users.find({}, { name: 1, _id: 0 })

排序

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

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

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

限制数量

javascript
// 只返回前5条
db.users.find().limit(5)

// 跳过前10条,返回5条
db.users.find().skip(10).limit(5)

统计数量

javascript
// 统计文档数量
db.users.countDocuments()

// 带条件的统计
db.users.countDocuments({ age: { $gte: 18 } })

// 估计数量(更快但不精确)
db.users.estimatedDocumentCount()

高级查询

存在性检查

javascript
// 查询有 email 字段的文档
db.users.find({ email: { $exists: true } })

// 查询没有 phone 字段的文档
db.users.find({ phone: { $exists: false } })

类型检查

javascript
// 查询 age 是整数类型的文档
db.users.find({ age: { $type: "int" } })

// 查询 name 是字符串类型的文档
db.users.find({ name: { $type: "string" } })

正则表达式查询

javascript
// 模糊查询 - 以 "张" 开头
db.users.find({ name: /^/ })

// 模糊查询 - 包含 "三"
db.users.find({ name: // })

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

// 复杂正则
db.users.find({ email: /^[a-z]+@[a-z]+\.[a-z]+$/ })

查询示例

综合查询

javascript
// 查询活跃用户,年龄18-60,按注册时间倒序
db.users.find({
  status: "active",
  age: { $gte: 18, $lte: 60 }
}, {
  name: 1,
  email: 1,
  age: 1
}).sort({ createdAt: -1 }).limit(20)

聚合查询

javascript
// 按城市分组统计用户数量
db.users.aggregate([
  { $group: { _id: "$city", count: { $sum: 1 } } },
  { $sort: { count: -1 } }
])

总结

查询文档要点:

  • find() 用于查询,findOne() 返回单个结果
  • 使用比较操作符进行条件查询
  • 使用逻辑操作符组合多个条件
  • 使用点符号查询嵌套文档
  • 使用投影控制返回字段

在下一章中,我们将学习 MongoDB 更新文档