MongoDB 中如何实现 "AND" 和 "OR" 查询?
在 MongoDB 中,实现 "AND"(与)和 "OR"(或)查询主要有以下几种方式。
1. AND 查询 (与)
MongoDB 中最常见的 "AND" 查询是隐式的,即在一个查询对象中列出多个字段,它们之间默认就是 "AND" 关系。
A. 隐式 AND (推荐)
这是最常用、最简洁的方式。只需用逗号分隔条件即可。
示例: 查找 status 为 "A" 且 age 小于 30 的文档。
javascript
db.users.find({
status: "A",
age: { $lt: 30 }
})
B. 显式 $and 操作符
虽然隐式写法能满足 99% 的需求,但在某些特殊情况下(例如对同一个字段应用多个复杂的逻辑表达式,或者结合 $or 使用时),你需要使用 $and。
语法: { $and: [ { 条件1 }, { 条件2 } ] }
示例:
javascript
db.users.find({
$and: [
{ status: "A" },
{ age: { $lt: 30 } }
]
})
2. OR 查询 (或)
"OR" 查询没有隐式写法,必须使用 $or 操作符,或者在特定场景下使用 $in。
A. 使用 $or 操作符
$or 接受一个数组,数组中的每个对象都是一个独立的查询条件。只要满足其中任意一个条件,文档就会被返回。
语法: { $or: [ { 条件1 }, { 条件2 } ] }
示例: 查找 status 为 "A" 或 age 小于 30 的文档。
javascript
db.users.find({
$or: [
{ status: "A" },
{ age: { $lt: 30 } }
]
})
B. 使用 $in 操作符 (针对同一字段的 OR)
如果你是在同一个字段上进行 "OR" 查询(例如:status 是 "A" 或 "B" 或 "C"),使用 $in 比 $or 更高效且代码更简洁。
示例: 查找 status 为 "A" 或 "B" 的文档。
javascript
// 推荐写法
db.users.find({
status: { $in: ["A", "B"] }
})
// 等同于以下的 $or 写法 (但不推荐这样写)
// db.users.find({ $or: [ { status: "A" }, { status: "B" } ] })
3. 联合使用 AND 和 OR
在实际业务中,通常需要混合使用。最常见的模式是:顶层使用隐式 AND,内部嵌套 $or。
场景示例:
查找 gender 为 "female" 且 (status 为 "A" 或 age 大于 25)。
javascript
db.users.find({
gender: "female", // 隐式 AND
$or: [ // OR 条件
{ status: "A" },
{ age: { $gt: 25 } }
]
})
4. 总结与最佳实践
| 逻辑关系 | 操作符/方法 | 适用场景 | 备注 |
|---|---|---|---|
| AND | { key1: val1, key2: val2 } |
绝大多数情况 | 首选。性能最好,语法最简。 |
| AND | $and |
复杂逻辑组合 | 仅在隐式写法无法表达时使用。 |
| OR | $in |
同一字段的多个值 | 首选(针对单字段)。性能优于 $or。 |
| OR | $or |
不同字段或复杂条件 | 必须使用数组格式。 |
注意: 在使用 $or 时,MongoDB 能够利用索引,但前提是 $or 数组中的每个子句都能独立使用索引。