基于本文回答

播面 播面

刷题像听歌,多听自然懂
0
评论

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 数组中的每个子句都能独立使用索引。

00:00
00:00