On this page
$or
在本页面
{ $or: [ { <expression1> }, { <expression2> }, ... , { <expressionN> } ] }
考虑以下示例:
db.inventory.find( { $or: [ { quantity: { $lt: 20 } }, { price: 10 } ] } )
此查询将选择inventory
集合中的所有文档,其中quantity
字段值小于20
或 price
字段值等于10
。
Behaviors
$或条款和索引
在评估$or表达式中的子句时,MongoDB 要么执行集合扫描,要么如果索引支持所有子句,则 MongoDB 会执行索引扫描。也就是说,为了使 MongoDB 使用索引来评估$or表达式,$or表达式中的所有子句都必须由索引支持。否则,MongoDB 将执行集合扫描。
当对$or个查询使用索引时,$or的每个子句都可以使用自己的索引。考虑以下查询:
db.inventory.find( { $or: [ { quantity: { $lt: 20 } }, { price: 10 } ] } )
为了支持此查询,而不是复合索引,您可以在quantity
上创建一个索引,在price
上创建另一个索引:
db.inventory.createIndex( { quantity: 1 } )
db.inventory.createIndex( { price: 1 } )
MongoDB 可以使用除geoHaystack索引之外的所有索引来支持$or子句。
$ or 和文本查询
在 2.6 版中进行了更改。
如果$or包含$text查询,则$or数组中的所有子句都必须有索引支持。这是因为$text查询必须使用索引,而$or仅在索引的所有子句都受索引支持的情况下才能使用索引。如果$text查询不能使用索引,则查询将返回错误。
$ or 和地理空间查询
在 2.6 版中进行了更改。
$or
支持geospatial clauses,但 Near 子句具有以下 exception(near 子句包括$nearSphere和$near)。 $or
不能包含带有任何其他子句的 Near 子句。
$ or 和排序操作
在 2.6 版中进行了更改。
现在使用sort()执行$or查询时,MongoDB 现在可以使用支持$or子句的索引。以前的版本未使用索引。
$ or 与$ in
当对相同字段的值进行相等性检查时,将$or与<expressions>
一起使用时,请使用$in运算符而不是$or运算符。
例如,要选择inventory
集合中quantity
字段值等于20
或 50
的所有文档,请使用$in运算符:
db.inventory.find ( { quantity: { $in: [20, 50] } } )
嵌套$或子句
您可以嵌套$or个操作。