MongoDB的逻辑查询运算符
文章目录
$and
语法:{ $and: [ { <expression1> }, { <expression2> } , ... , { <expressionN> } ] }
$and在一个或多个表达式(例如<expression1>
,<expression2>
等)的数组上执行逻辑AND操作,然后选择满足数组中所有表达式的文档。 $ and运算符使用短路评估。 如果第一个表达式(例如<expression1>
)的计算结果为false,则MongoDB将不计算其余的表达式。
注意
在指定逗号分隔的表达式列表时,MongoDB提供隐式AND操作。当必须在多个表达式中指定相同的字段或运算符时,必须与$ and运算符一起使用显式AND。
例子
AND查询使用倍数表达指定同一field
考虑以下示例:
|
|
该查询将选择inventory 集合中的所有文档,其中:
- 该price字段值不等于1.99
- 该price字段存在。
AND通过组合price字段的运算符表达式,也可以使用隐式操作构造此查询。例如,此查询可以写为:
|
|
具有多个表达式的AND查询指定相同的运算符
考虑以下示例:
|
|
该查询将选择以下位置的所有文档:
- 该price字段值等于0.99或1.99,和
- 该sale字段值是等于true 或qty字段值小于20。
此查询不能使用隐式AND运算构造,因为它多次使用$or运算符。
$not
语法:{ field: { $not: { <operator-expression> } } }
$not执行逻辑NOT上指定的操作<operator-expression>
并选择那些文件不匹配<operator-expression>
。这包括不包含field的文档。
考虑以下查询:
|
|
该查询将选择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开头的文档。
|
|
$regex 运算符表达式(从MongoDB 4.0.7开始)
例如,以下查询选择库存集合中所有项目字段值都不以字母p开头的文档。
|
|
驱动程序语言的正则表达式对象
例如,以下PyMongo查询使用Python的re.compile()方法来编译正则表达式:
|
|
## $nor
$nor
在一个或多个查询表达式的数组上执行逻辑NOR操作,并选择使数组中所有查询表达式均失败的文档。$nor
具有以下语法:
|
|
例子
$nor用两个表达式查询
考虑以下仅使用$nor运算符的查询:
|
|
该查询将返回以下所有文档:
- 包含price字段但不等于1.99,包含sale字段但不等于true
- 包含price字段且不等于1.99,不包含sale字段
- 不包含price字段,但包含了sale字段且不等于true
- 不包含price字段,且不包含sale字段
$nor和其他比较
考虑以下查询:
|
|
该查询将选择inventory集合中的所有文档,其中:
- 该price字段值不不等于1.99
- 该qty字段值是不小于20
- 该sale字段值不等于true
包括不包含这些字段的那些文档。
返回的文档中不包含$nor
表达式中的字段的例外情况是将$nor
运算符与$exists
运算符一起使用时。
$nor和$exists
将其与以下将$nor运算符与$exists运算符一起使用的查询进行比较 :
|
|
该查询将返回以下所有文档:
包含不等于1.99的price字段,并包含sale不等于true的字段
$or
$or
运算符对两个或多个<expressions>
的数组执行逻辑或运算,并选择满足至少一个<expressions>
的文档。 $or
具有以下语法:
|
|
考虑以下示例:
|
|
此查询将选择的所有文档inventory集合,其中任一quantity字段值小于20 或该price字段的值等于10。
特性
$or和索引
在对$or
表达式中的子句求值时,MongoDB要么执行集合扫描,要么如果索引支持所有子句,则MongoDB会执行索引扫描。也就是说,为了使MongoDB使用索引来评估$or
表达式,$or
表达式中的所有子句都必须由索引支持。否则,MongoDB将执行集合扫描。
在$or查询中使用索引时,$or的每个子句都可以使用自己的索引。考虑以下查询:
|
|
为了支持此查询,而不是复合索引,您可以在上创建一个索引,在上创建quantity另一个索引price:
|
|
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
|
|
嵌套$or
您可以嵌套$or操作。
文章作者 Forz
上次更新 2020-05-13