$or

在本页面

$or

$or操作符对包含两个或多个<expressions>的数组执行逻辑或操作,并选择满足至少一个<expressions>的文档。$or的语法如下:

{ $or: [ { <expression1> }, { <expression2> }, ... , { <expressionN> } ] }

考虑下面的例子:

db.inventory.find( { $or: [ { quantity: { $lt: 20 } }, { price: 10 } ] } )

该查询将选择inventory集合中quantity字段值小于20price字段值等于10的所有文档。

行为

$or子句和索引

当对$or表达式中的子句求值时,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子句。

$not和正则表达式

如果$or包含$text查询,则$or数组中的所有子句必须由索引支持。这是因为$text查询必须使用索引,而$or只能在索引支持其所有子句的情况下使用索引。如果$text查询不能使用索引,则查询将返回一个错误。

$or和地理空间查询

$or支持地理空间子句,但near子句有以下例外(near子句包括$nearSphere$near)。$or不能包含任何其他子句的near子句。

$or和排序操作

当使用sort()执行$or查询时,MongoDB现在可以使用支持$or子句的索引。以前的版本不使用索引。

$or$in

当使用$or <expressions>来检查相同字段的值时,使用$in操作符而不是$or操作符。

例如,要选择数量字段值为2050的库存集合中的所有文档,使用$in操作符:

db.inventory.find ( { quantity: { $in: [20, 50] } } )

Nested $or Clauses

你可能会嵌套$or操作。

也可以看看

$and, find(), sort(), $in

译者:李冠飞

校对:

最后更新于