$or
$or
的
$or
操作符在包含一个或多个 表达式 的数组上执行逻辑OR
操作,并选择满足 至少 一个表达式
的文档。
兼容性
您可以使用 $or
在以下环境中进行部署
MongoDB Atlas:云中 MongoDB 部署的完全托管服务
MongoDB Enterprise:基于订阅的、自管理的 MongoDB 版本
MongoDB Community:源代码可用的、免费使用且自管理的 MongoDB 版本
语法
$or
操作符具有以下语法
{ $or: [ { <expression1> }, { <expression2> }, ... , { <expressionN> } ] }
考虑以下示例
db.inventory.find( { $or: [ { quantity: { $lt: 20 } }, { price: 10 } ] } )
此查询将选择所有在 库存
集合中的文档,其中 数量
字段值小于 20
或 价格
字段值等于 10
。
行为
$or
子句和索引
在评估 $or
表达式中的子句时,MongoDB 要么执行集合扫描,要么如果所有子句都由索引支持,MongoDB 执行索引扫描。也就是说,为了使 MongoDB 使用索引来评估 $or
表达式,$or
表达式中的所有子句都必须由索引支持。否则,MongoDB 将执行集合扫描。
在用 $or
查询使用索引时,$or
的每个子句都可以使用自己的索引。考虑以下查询
db.inventory.find( { $or: [ { quantity: { $lt: 20 } }, { price: 10 } ] } )
为了支持此查询,而不是复合索引,您应该创建一个针对 数量
的索引,另一个针对 价格
的索引。
db.inventory.createIndex( { quantity: 1 } ) db.inventory.createIndex( { price: 1 } )
$or
和 text
查询
如果 $or
包含一个 $text
查询,则 $or
数组中的所有子句都必须由索引支持。这是因为 $text
查询 必须 使用索引,而 $or
只有在其所有子句都由索引支持的情况下才能使用索引。如果 $text
查询无法使用索引,则查询将返回错误。
注意
$text
为自托管(非 Atlas)部署提供文本查询功能。对于托管在 MongoDB Atlas 上的数据,MongoDB 提供了改进的全文查询解决方案,Atlas Search。
$or
和地理空间查询
$or
支持以下例外情况的地理空间子句:地理空间子句(附近子句包括 $nearSphere
和 $near
)。$or
不能包含任何其他子句的附近子句。
$or
和排序操作
当执行$or
查询并使用sort()
时,MongoDB可以使用支持$or
子句的索引。
$or
和部分索引
您可以使用$or
创建部分索引。使用db.collection.createIndex()方法的partialFilterExpression
创建部分索引。
$or
与 $in
的比较
当使用$or
与用于检查同一字段值的相等表达式时,请使用$in
操作符而不是$or
操作符。
例如,要选择库存集合中所有数量字段值等于20或50的文档,请使用$in
运算符
db.inventory.find ( { quantity: { $in: [20, 50] } } )
嵌套的$or
子句
您可以嵌套$or
操作。
错误处理
为了允许查询引擎优化查询,$or
将错误处理如下
如果任何提供给
$or
的表达式在单独评估时会导致错误,则包含该表达式的$or
可能会导致错误,但错误不是保证发生的。提供给
$or
的第一个表达式之后的表达式可能会引起错误,即使第一个表达式评估为true
。
例如,以下查询如果在$x
为0
时,总是会产生错误
db.example.find( { $expr: { $eq: [ { $divide: [ 1, "$x" ] }, 3 ] } } )
以下查询,其中包含提供给$or
的多个表达式,如果在任何文档中$x
为0
,则可能会产生错误
db.example.find( { $or: [ { x: { $eq: 0 } }, { $expr: { $eq: [ { $divide: [ 1, "$x" ] }, 3 ] } } ] } )