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 更新文档。