$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个操作。

See also

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

首页