#MongoDB 查询文档
MongoDB 提供了强大的查询功能,可以精确查找、过滤和检索文档。
#基本查询
#find() 方法
db.collection.find(query, projection)#查询所有文档
// 查询所有文档
db.users.find()
// 美化输出
db.users.find().pretty()#查询单个文档
// 返回第一个匹配的文档
db.users.findOne()
// 带条件的单个查询
db.users.findOne({ name: "张三" })#条件查询
#精确匹配
// 查询 name 为 "张三" 的文档
db.users.find({ name: "张三" })
// 查询多个条件(AND)
db.users.find({ name: "张三", age: 25 })#比较操作符
// 大于 $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 } })#多值查询
// $in - 匹配数组中任意值
db.users.find({ age: { $in: [20, 25, 30] } })
// $nin - 不匹配数组中任何值
db.users.find({ age: { $nin: [20, 25] } })#逻辑操作符
#AND 条件
// 隐式 AND
db.users.find({ name: "张三", age: 25, city: "北京" })
// 显式 $and
db.users.find({
$and: [
{ name: "张三" },
{ age: 25 }
]
})#OR 条件
// $or
db.users.find({
$or: [
{ name: "张三" },
{ name: "李四" }
]
})
// 年龄小于20或大于60
db.users.find({
$or: [
{ age: { $lt: 20 } },
{ age: { $gt: 60 } }
]
})#NOT 条件
// $not
db.users.find({ age: { $not: { $gt: 25 } } })#NOR 条件
// $nor - 所有条件都不满足
db.users.find({
$nor: [
{ name: "张三" },
{ age: 25 }
]
})#数组查询
#查询包含元素的数组
// 查询 tags 包含 "技术" 的文档
db.articles.find({ tags: "技术" })
// 查询包含多个元素的数组
db.articles.find({ tags: { $all: ["技术", "MongoDB"] } })#查询数组长度
// 查询 tags 有2个元素的文档
db.articles.find({ tags: { $size: 2 } })#查询数组特定位置
// 查询 tags 第一个元素是 "技术"
db.articles.find({ "tags.0": "技术" })#嵌套文档查询
#点符号查询
// 查询 address.city 为 "北京"
db.users.find({ "address.city": "北京" })
// 查询嵌套字段
db.users.find({ "contacts.phone": "13800138000" })#查询整个嵌套文档
db.users.find({
address: {
city: "北京",
street: "长安街"
}
})#结果处理
#限制返回字段
// 只返回 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 })#排序
// 按 age 升序
db.users.find().sort({ age: 1 })
// 按 age 降序
db.users.find().sort({ age: -1 })
// 多字段排序
db.users.find().sort({ age: -1, name: 1 })#限制数量
// 只返回前5条
db.users.find().limit(5)
// 跳过前10条,返回5条
db.users.find().skip(10).limit(5)#统计数量
// 统计文档数量
db.users.countDocuments()
// 带条件的统计
db.users.countDocuments({ age: { $gte: 18 } })
// 估计数量(更快但不精确)
db.users.estimatedDocumentCount()#高级查询
#存在性检查
// 查询有 email 字段的文档
db.users.find({ email: { $exists: true } })
// 查询没有 phone 字段的文档
db.users.find({ phone: { $exists: false } })#类型检查
// 查询 age 是整数类型的文档
db.users.find({ age: { $type: "int" } })
// 查询 name 是字符串类型的文档
db.users.find({ name: { $type: "string" } })#正则表达式查询
// 模糊查询 - 以 "张" 开头
db.users.find({ name: /^张/ })
// 模糊查询 - 包含 "三"
db.users.find({ name: /三/ })
// 忽略大小写
db.users.find({ name: /john/i })
// 复杂正则
db.users.find({ email: /^[a-z]+@[a-z]+\.[a-z]+$/ })#查询示例
#综合查询
// 查询活跃用户,年龄18-60,按注册时间倒序
db.users.find({
status: "active",
age: { $gte: 18, $lte: 60 }
}, {
name: 1,
email: 1,
age: 1
}).sort({ createdAt: -1 }).limit(20)#聚合查询
// 按城市分组统计用户数量
db.users.aggregate([
{ $group: { _id: "$city", count: { $sum: 1 } } },
{ $sort: { count: -1 } }
])#总结
查询文档要点:
find()用于查询,findOne()返回单个结果- 使用比较操作符进行条件查询
- 使用逻辑操作符组合多个条件
- 使用点符号查询嵌套文档
- 使用投影控制返回字段
在下一章中,我们将学习 MongoDB 更新文档。