On this page本页内容
$or
The $or operator performs a logical OR operation on an array of two or more <expressions> and selects the documents that satisfy at least one of the <expressions>. $or运算符对包含两个或多个<expressions>的数组执行逻辑OR运算,并选择至少满足其中一个<expressions>的文档。The $or has the following syntax:$or具有以下语法:
{ $or: [ { <expression1> }, { <expression2> }, ... , { <expressionN> } ] }
Consider the following example:考虑以下示例:
db.inventory.find( { $or: [ { quantity: { $lt: 20 } }, { price: 10 } ] } )
This query will select all documents in the 此查询将选择inventory collection where either the quantity field value is less than 20 or the price field value equals 10.inventory集合中quantity字段值小于20或price字段值等于10的所有文档。
$orWhen evaluating the clauses in the 在计算$or expression, MongoDB either performs a collection scan or, if all the clauses are supported by indexes, MongoDB performs index scans. $or表达式中的子句时,MongoDB要么执行集合扫描,要么(如果所有子句都受索引支持)MongoDB执行索引扫描。That is, for MongoDB to use indexes to evaluate an 也就是说,对于MongoDB使用索引来计算$or expression, all the clauses in the $or expression must be supported by indexes. $or表达式,$or表达式中的所有子句都必须得到索引的支持。Otherwise, MongoDB will perform a collection scan.否则,MongoDB将执行集合扫描。
When using indexes with 在对$or queries, each clause of an $or can use its own index. $or查询使用索引时,$or的每个子句都可以使用自己的索引。Consider the following query:考虑以下查询:
db.inventory.find( { $or: [ { quantity: { $lt: 20 } }, { price: 10 } ] } )
To support this query, rather than a compound index, you would create one index on 为了支持此查询,而不是复合索引,您需要创建一个quantity and another index on price:quantity索引和另一个price索引:
db.inventory.createIndex( { quantity: 1 } )
db.inventory.createIndex( { price: 1 } )
MongoDB can use all but the geoHaystack index to support MongoDB可以使用除geoHaystack索引之外的所有索引来支持$or clauses.$or子句。
$or and text Queries$or和text查询If 如果$or includes a $text query, all clauses in the $or array must be supported by an index. $or包含$text查询,则索引必须支持$or数组中的所有子句。This is because a 这是因为$text query must use an index, and $or can only use indexes if all its clauses are supported by indexes. $text查询必须使用索引,而$or只能在索引支持其所有子句的情况下使用索引。If the 如果$text query cannot use an index, the query will return an error.$text查询无法使用索引,则查询将返回错误。
$or$or supports geospatial clauses with the following exception for the near clause (near clause includes $nearSphere and $near). $or支持地理空间子句,但near子句有以下例外(near子句包括$nearSphere和$near)。$or cannot contain a near clause with any other clause.不能将near子句与任何其他子句一起包含。
$orWhen executing 当使用$or queries with a sort(), MongoDB can now use indexes that support the $or clauses. sort()执行$or查询时,MongoDB现在可以使用支持$or子句的索引。Previous versions did not use the indexes.以前的版本没有使用索引。
$or$inWhen using 如果使用$or with <expressions> that are equality checks for the value of the same field, use the $in operator instead of the $or operator.$or与<expressions>一起检查同一字段的值是否相等,请使用$in运算符而不是$or运算符。
For example, to select all documents in the 例如,要选择inventory collection where the quantity field value equals either 20 or 50, use the $in operator:inventory集合中quantity字段值等于20或50的所有文档,请使用$in运算符:
db.inventory.find ( { quantity: { $in: [20, 50] } } )
$or Clauses$or子句You may nest 您可以嵌套$or operations.$or操作。
To allow the query engine to optimize queries, 要允许查询引擎优化查询,$or handles errors as follows:$or按如下方式处理错误:
$or would cause an error when evaluated alone, the $or containing the expression may cause an error but an error is not guaranteed.$or的任何表达式在单独计算时会导致错误,则包含表达式的$or可能会导致错误但不保证会出现错误。$or may cause an error even if the first expression evaluates to true.$or的第一个表达式之后提供的表达式可能会导致错误,即使第一个表达式的计算结果为true。For example, the following query always produces an error if 例如,如果$x is 0:$x为0,以下查询始终会产生错误:
db.example.find( {
$expr: { $eq: [ { $divide: [ 1, "$x" ] }, 3 ] }
} )
The following query, which contains multiple expressions supplied to 以下查询包含提供给$or, may produce an error if there is any document where $x is 0:$or的多个表达式,如果存在$x为0的任何文档,则可能会产生错误:
db.example.find( {
$or: [
{ x: { $eq: 0 } },
{ $expr: { $eq: [ { $divide: [ 1, "$x" ] }, 3 ] } }
]
} )