MongoDB逻辑操作符$or, $and,$not,$nor

摘要:
$or是一个逻辑或运算符,它对一个数据或多个表达式进行运算,并且需要选择至少一个满足条件的表达式$或者至少具有以下表达式:{$或:{<expression1>},{<表达式2>},。。。,{<表达式N>}]}考虑以下示例:db。库存查找({$或:〔{数量:{$lt:20}},{价格:10}〕})

$or是一个逻辑or操作符操作在一个数据或者多个表达式并且需要选择至少一个满足条件的表达式,$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 } )

$or和sort()操作

当使用$or执行sort()查询时,MongoDB可以使用支持$or查询条件的索引。之前的版本不支持索引。 

$or与$in

使用$or操作比较字段的值是否等于某个值时可以使用$in替换$or操作;例如查询集合inventory中字段quantity的值等于20或者50的所有文档,使用$in操作:

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

$and逻辑表达式

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

$and执行一个逻辑and操作在一个或者多个表达式上,并且查询数组中指定的所有表达式指定的文档document,$and使用短路求值,如果第一个表达式的结果是false,MongoDB将不会执行剩余的表达式;

例如:and查询指定同一个字段的多个查询条件

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

这个查询会选择集合inventory中的所有文档,条件是price不等于1.99并且price字段存在;

以上查询还可以使用隐式AND操作,如下:

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

 AND查询使用多个表达式指定相同的操作:

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操作在指定的表达式并查询到不匹配表达式的文档,这包含不包括字段的文档;

考虑如下操作:

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

此查询将会查询inventory集合中的文档,条件如下:price字段小于等于1.99或者price不存在。

{ $not: { $gt: 1.99 } } 不同于$lte操作,{ $lte: 1.99 }操作只会返回price字段存在并且小于等于1.99的字段。

记住$not操作符只会影响其他操作符不能独立检查字段和文档,因此使用$not做逻辑析取和$ne操作测试字段内容; 

使用$not操作时考虑如下操作:

操作$not操作符和其它操作符一致但是会产生一些意想不到的结果,比如数组之类的数据类型;

$not操作符不支持$regex正则表达式操作,使用//或者你的驱动接口代替,使用语言的正则表达式功能创建正则表达式对象;

考虑下面的例子使用模式匹配//:

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

此查询将会查询inventory集合中item字段不是以p开头的所有文档; 

$nor

{ $nor: [ { <expression1> }, { <expression2> }, ... { <expressionN> } ] }
考虑如下操作:

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

查询返回所有的文档,条件是:

包含字段price值不等于1.99,包含字段sale值不等于true,或者包含字段price值不等于1.99,不包含字段sale;或者不包含字段price,包含字段sale值不等于true;或者不包含字段price,不包含字段sale; 

$nor额外比较

考虑入校操作:

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

inventory集合查询所有的文档,条件如下:

字段price不等于1.99,字段qty不小于20,字段sale不等于true;查询的结果包含不存在的字段;

原文:https://blog.csdn.net/yaomingyang/article/details/75103480

免责声明:文章转载自《MongoDB逻辑操作符$or, $and,$not,$nor》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇Linux more命令详解asp.net分割字符串的几种方法下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

MongoDB查询(游标操作、游标信息)

转自:http://blog.csdn.net/congcong68/article/details/46933609 一、简介 db.collection.find()可以实现根据条件查询和指定使用投影运算符返回的字段省略此参数返回匹配文档中的所有字段。并返回到匹配文档的游标,可以随意修改查询限制、跳跃、和排序顺序的功能。 二、db.collectio...

MongoDB 高级查询_aggregate聚合管道

MongoDB 聚合管道(AggregationPipeline) 使用聚合管道可以对集合中的文档进行变换和组合。实际项目应用主要是表关联查询、数据的统计。 MongoDB 中使用 db.COLLECTION_NAME.aggregate([{<stage>},...]) 方法 来构建和使用聚合管道。下面是官网给的实例,感受一下聚合管道的用法。...

解决mongodb的安装mongod命令不是内部或外部命令

1:安装 去mongodb的官网http://www.mongodb.org/downloads下载32bit的包 解压后会出现以下文件 在安装的盘C:下建立mongodb文件夹,拷贝bin文件夹到该目录下,这样就相当于安装了mongodb的相关命令。 为了启动mongodb方便,将mongod.exe路径加入环境变量,电脑->属性->高...

分布式文档存储数据库之MongoDB备份与恢复

  前文我们聊了下mongodb的访问控制以及用户创建和角色分配,回顾请参考https://www.cnblogs.com/qiuhom-1874/p/13974656.html;今天我们来了解下mongodb的备份与恢复   为什么要备份?   备份的目的是对数据做冗余的一种方式,它能够让我们在某种情况下保证最少数据的丢失;之前我们对mongodb做副本...

Mongodb中的js语法

定义一个变量 > var len = 10; For循环 这里的db和data都可以作为对象 save是方法 接收一个临时定义的对象 > for(var i = 0; i < len; i++){db.data.save({x:i})}; WriteResult({ "nInserted" : 1 }) > db.dat...

mongodb 安装

a.安装   本人下载的是windows版本的3.2.1mongo,路径为https://fastdl.mongodb.org/win32/mongodb-win32-x86_64-2008plus-ssl-3.2.1-signed.msi   或者直接去官网也可以http://www.mongodb.org/downloads   不过需要注意的是mo...