Docs 菜单
Docs 主页
/
MongoDB Manual
/ / / /

$or

在此页面上

  • 兼容性
  • 语法
  • 行为
$or

$or 操作符对一个或多个 <expressions> 数组执行逻辑 OR 运算,并选择至少满足其中一个 <expressions> 的文档。

可以使用 $or 查找托管在以下环境中的部署:

  • MongoDB Atlas:用于云中 MongoDB 部署的完全托管服务

  • MongoDB Enterprise:基于订阅、自我管理的 MongoDB 版本

  • MongoDB Community:源代码可用、免费使用且可自行管理的 MongoDB 版本

$or 操作符的语法如下:

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

考虑以下示例:

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

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

$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 包含 $text 查询,则 $or 数组中的所有子句都必须由索引支持。这是因为 $text 查询必须使用索引,而仅当索引支持 $or 的所有子句时,后者才能使用索引。如果 $text 查询无法使用索引,则该查询将返回错误。

注意

$text 提供自管理(非 Atlas)部署的文本查询功能。对于托管在 MongoDB Atlas 上的数据,MongoDB 提供了一种改进的全文查询解决方案 Atlas Search

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

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

您可以使用 $or 来创建部分索引。使用 db.collection.createIndex() 方法的 partialFilterExpression 来创建部分索引。

使用 $or<expressions> 对同一字段的值进行相等检查时,请使用 $in 操作符而不是 $or 操作符。

例如,要选择 inventory 集合中 quantity 字段值等于 20 50 的所有文档,请使用 $in 操作符:

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

您可以嵌套 $or 操作。

提示

另请参阅:

要允许查询引擎优化查询,$or 会按如下方式处理错误:

  • 如果提供给 $or 的任何表达式在单独求值时会导致错误,则包含该表达式的 $or 可能但不一定会导致错误。

  • 在提供给 $or 的第一个表达式之后提供的表达式可能会导致错误,即使第一个表达式的计算结果为 true

例如,如果 $x0,以下查询会始终产生错误:

db.example.find( {
$expr: { $eq: [ { $divide: [ 1, "$x" ] }, 3 ] }
} )

以下查询包含提供给 $or 的多个表达式,如果存在 $x0 的任何文档,则查询可能会产生错误:

db.example.find( {
$or: [
{ x: { $eq: 0 } },
{ $expr: { $eq: [ { $divide: [ 1, "$x" ] }, 3 ] } }
]
} )

后退

$nor

在此页面上