$and

语法:{ $and: [ { <expression1> }, { <expression2> } , ... , { <expressionN> } ] }

$and在一个或多个表达式(例如<expression1><expression2>等)的数组上执行逻辑AND操作,然后选择满足数组中所有表达式的文档。 $ and运算符使用短路评估。 如果第一个表达式(例如<expression1>)的计算结果为false,则MongoDB将不计算其余的表达式。

注意

在指定逗号分隔的表达式列表时,MongoDB提供隐式AND操作。当必须在多个表达式中指定相同的字段或运算符时,必须与$ and运算符一起使用显式AND。

例子

AND查询使用倍数表达指定同一field

考虑以下示例:

1
db.inventory.find( { $and: [ { price: { $ne: 1.99 } }, { price: { $exists: true } } ] } )

该查询将选择inventory 集合中的所有文档,其中:

  • 该price字段值不等于1.99
  • 该price字段存在。

AND通过组合price字段的运算符表达式,也可以使用隐式操作构造此查询。例如,此查询可以写为:

1
db.inventory.find( { price: { $ne: 1.99, $exists: true } } )

具有多个表达式的AND查询指定相同的运算符

考虑以下示例:

1
2
3
4
5
6
db.inventory.find( {
    $and : [
        { $or : [ { price : 0.99 }, { price : 1.99 } ] },
        { $or : [ { sale : true }, { qty : { $lt : 20 } } ] }
    ]
} )

该查询将选择以下位置的所有文档:

  • 该price字段值等于0.99或1.99,和
  • 该sale字段值是等于true 或qty字段值小于20。

此查询不能使用隐式AND运算构造,因为它多次使用$or运算符。

$not

语法:{ field: { $not: { <operator-expression> } } }

$not执行逻辑NOT上指定的操作<operator-expression>并选择那些文件不匹配<operator-expression>。这包括不包含field的文档。

考虑以下查询:

1
db.inventory.find( { price: { $not: { $gt: 1.99 } } } )

该查询将选择inventory集合中的所有文档,其中:

  • 该price字段的值小于或等于1.99
  • 该price字段不存在

{ $not: { $gt: 1.99 } }{ $lte: 1.99 }不同。{$ lte:1.99}仅返回存在price字段且其值小于或等于1.99的文档。

请记住,该$not运算符仅影响其他运算符,不能独立检查字段和文档。因此,请使用$not运算符进行逻辑析取,然后使用$ne运算符直接测试字段的内容。

特性

$not和数据类型

该运算$not符的操作与其他运算符的特性一致,但对于某些数据类型(如数组)可能会产生意外结果。

$not和正则表达式

$not可以对以下内容执行逻辑NOT运算:

规范的正则表达式(即/pattern/).

例如,以下查询选择库存集合中所有项目字段值都不以字母p开头的文档。

1
db.inventory.find( { item: { $not: /^p.*/ } } )

$regex 运算符表达式(从MongoDB 4.0.7开始)

例如,以下查询选择库存集合中所有项目字段值都不以字母p开头的文档。

1
2
db.inventory.find( { item: { $not: { $regex: "^p.*" } } } )
db.inventory.find( { item: { $not: { $regex: /^p.*/ } } } )

驱动程序语言的正则表达式对象

例如,以下PyMongo查询使用Python的re.compile()方法来编译正则表达式:

1
2
3
import re
for noMatch in db.inventory.find( { "item": { "$not": re.compile("^p.*") } } ):
    print noMatch

## $nor

$nor在一个或多个查询表达式的数组上执行逻辑NOR操作,并选择使数组中所有查询表达式均失败的文档。$nor具有以下语法:

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

例子

$nor用两个表达式查询

考虑以下仅使用$nor运算符的查询:

1
db.inventory.find( { $nor: [ { price: 1.99 }, { sale: true } ]  } )

该查询将返回以下所有文档:

  • 包含price字段但不等于1.99,包含sale字段但不等于true
  • 包含price字段且不等于1.99,不包含sale字段
  • 不包含price字段,但包含了sale字段且不等于true
  • 不包含price字段,且不包含sale字段

$nor和其他比较

考虑以下查询:

1
db.inventory.find( { $nor: [ { price: 1.99 }, { qty: { $lt: 20 } }, { sale: true } ] } )

该查询将选择inventory集合中的所有文档,其中:

  • 该price字段值不不等于1.99
  • 该qty字段值是不小于20
  • 该sale字段值不等于true

包括不包含这些字段的那些文档。

返回的文档中不包含$nor表达式中的字段的例外情况是将$nor运算符与$exists运算符一起使用时。

$nor和$exists

将其与以下将$nor运算符与$exists运算符一起使用的查询进行比较 :

1
2
db.inventory.find( { $nor: [ { price: 1.99 }, { price: { $exists: false } },
                             { sale: true }, { sale: { $exists: false } } ] } )

该查询将返回以下所有文档:

包含不等于1.99的price字段,并包含sale不等于true的字段

$or

$or运算符对两个或多个<expressions>的数组执行逻辑或运算,并选择满足至少一个<expressions>的文档。 $or具有以下语法:

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

考虑以下示例:

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

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

特性

$or和索引

在对$or表达式中的子句求值时,MongoDB要么执行集合扫描,要么如果索引支持所有子句,则MongoDB会执行索引扫描。也就是说,为了使MongoDB使用索引来评估$or表达式,$or表达式中的所有子句都必须由索引支持。否则,MongoDB将执行集合扫描。

在$or查询中使用索引时,$or的每个子句都可以使用自己的索引。考虑以下查询:

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

为了支持此查询,而不是复合索引,您可以在上创建一个索引,在上创建quantity另一个索引price:

1
2
db.inventory.createIndex( { quantity: 1 } )
db.inventory.createIndex( { price: 1 } )

MongoDB可以使用除geoHaystack 索引之外的所有索引来支持$or子句。

$or和text查询

如果$or包含$text查询,则$or索引中必须支持数组中的所有子句 。这是因为 $text查询必须使用索引,并且$or仅当索引的所有子句都受索引支持时才能使用索引。如果 $text查询不能使用索引,查询将返回错误。

$or和地理空间查询

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

$or和排序操作

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

$or$in

$or<expressions>that一起使用时,将检查同一字段的值是否相等,请使用$in运算符而不是$or运算符。

例如,要选择字段值等于或的inventory集合中的所有文档,请使用 运算符:quantity20 50$in

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

嵌套$or

您可以嵌套$or操作。