MongoDB逻辑操作符$or, $and,$not,$nor
$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的更多相关文章
- MongoDB【第二篇】MongoDB逻辑与物理存储结构
基本的操作 一.常用的命令和基础知识 1.进入MongoDB sehll 首先我们进入到MongoDB所在目录执行 cd /work/app/mongodb/bin/ #启动 ./mongo 为了方便 ...
- MongoDB 逻辑还原工具mongorestore
mongorestore是官方提供用来还原导入由mongodump导出生成的二进制备份文件的工具,通常与mongodump配合使用,关于mongodump工具的使用可以参考另一篇博文:MongoDB ...
- MongoDB 逻辑与操作
看下面两个例子 rs1:PRIMARY> db.display.find({$and: [{$where: '(1386813645 - this.last_active_time > 3 ...
- mongodb 常用操作符
最近常用mongodb数据库,但是很多操作符不清楚或不知道,所有抽空根据手册整理下,以便于以后查阅(基于3.4版本) 1.查询和投影操作符 1.1比较操作符 $eq 匹配字段值等于指定值的文档 { & ...
- MongoDB 逻辑备份工具mongodump
mongodump是官方提供的一个对数据库进行逻辑导出的备份工具,导出文件为BSON二进制格式,无法使用文本编辑工具直接查看.mongodump可以导出mongod或者mongos实例的数据,从集群模 ...
- 你好,C++(17)0.1*10不等于1.0——4.1.4 关系操作符4.1.5 逻辑操作符
4.1.4 关系操作符 在C++中,除了需要用算术操作符对数据进行加减乘除的算术操作之外,我们有时候还需要对数据之间的关系进行操作,也就是对两个数据进行大小比较,得出它们之间的大小关系.在现实世界中 ...
- MongoDB 条件操作符
描述 条件操作符用于比较两个表达式并从mongoDB集合中获取数据. 在本章节中,我们将讨论如何在MongoDB中使用条件操作符. MongoDB中条件操作符有: (>) 大于 - $gt (& ...
- Chapter3_操作符_逻辑操作符
逻辑操作符与(&&)或(||)非(^)能够对布尔类型的数据类型进行操作,并且生成布尔值,和关系操作符的产生的数据类型是一样的.需要注意的不多,有以下几点: (1)在需要使用string ...
- Lua逻辑操作符
[1]逻辑操作符and.or和not 应用示例: ) ) -- nil ) -- false ) ) ) ) ) ) ) print(not nil) -- ture print(not false) ...
随机推荐
- 数据库内连接GROUP BY查询外键表数据行的总数
最近看了看SQL,刚好遇到这个问题. INNER JOIN [外键表] ON [主键表] 内链接,用 GROUP BY 分组外键数据,COUNT(*)计算该外键数据总行数,最后用 ORDER BY 排 ...
- 造轮子,模仿WPF的UI框架,还没完善。。。
Wtf(暂时命名,随便起的 = _=),模仿WPF的框架,还没有完善,只有简单的基础元素,支持数据绑定.虽然支持mono但是mono有bug 写这个只是兴趣爱好,感觉也没多大意义了,如果这个UI框架完 ...
- linux下如何批量杀JAVA进程或某个进程方法
linux下如何批量杀JAVA进程或某个进程方法 在工作中经常需要停止JAVA进程,停止时间也比较长,那么有时候因为一些情况,需要把 linux 下JAVA所有进程 kill 掉,又不能用killal ...
- SVN多项目并行版本管理解决方案
1.背景 随着公司业务拓展,各业务部门频繁的需求变更,导致系统集成冲突的问题日益突出. 2.现状 基于SVN版本管理模式,多分支版本并行,分支合并主干交付.多分支开发存在依赖关系且有交付的先后顺序, ...
- node 跨域问题
node跨域有很多方法 1.引入 中间件cors 我觉的最好的方法 var express=require('express'); var cors=require('cors'); var app= ...
- 【代码笔记】Web-JavaScript-JavaScript 数据类型
一,效果图. 二,代码. <!DOCTYPE html> <html> <head> <meta charset="utf-8"> ...
- Apex 的异常处理
Apex 中的异常处理 在 Apex 中,和其他语言类似,对于异常处理通常使用 try.catch.finally.throw 等关键字. 对于每一个 try 代码段,必须要有至少一个 catch 或 ...
- 创建Android Apps的30个经验教训
这个世界上有两种人-从经验教训中学习的人以及听从别人建议的人.这里是我一路走来学到的一些东西,分享给大家: 在添加任何第三方party之前,请三思:这真的是一个成熟的项目吗? 如果一个东西用户看不到, ...
- weblogic系列漏洞整理 -- 1. weblogic安装
目录 0. 概述 1. 下载安装Java环境 2. 下载安装weblogic 安装 部署domain域 进入weblogic 3. 排错 如果出现如下错误 0. 概述 WebLogic是美国Oracl ...
- Asp.net MVC通过自定义特性实现Action日志记录
一.自定义特性 /// <summary> /// 描述特性 /// </summary> [AttributeUsage(AttributeTargets.Method)] ...