MongoDB查询(上)

1.find

MongoDB使用find来进行查询.查询就是返回一个集合中文档的子集,子集合的范围从0个文档到整个集合.find的第一个参数

决定了要返回哪些文档.其形式也是一个文档,说明要查询的细节.

空的查询文档{}会匹配集合的全部内容.要是不指定查询文档,默认是{}.

如:db.users.find()返回集合users中的所有内容.

向查询文档中添加键值对,就意味着添加了查询条件.对绝大多数类型来说,整数匹配整数,布尔类型匹配布尔类型,字符串匹配

字符串.

2.指定返回的键

有时并不需要返回文档中的所有键值对返回.可以通过find或findOne的第二个参数来指定要返回的键.这样做能节省传输的

数据量,又能节省客户端解码文档的时间和内存消耗.

db.users.findOne({"name":"refactor"},{"age":1,"sex":1})

只会将键为_id,age,sex的数据返回.

"_id"键总是会被返回.

也可以用第二个参数来剔除查询结果中的某个键值对.

如:  www.2cto.com

键name不会显示在返回的结果中

db.users.findOne({"name":"refactor"},{"name":0})

只会将键为age,sex的数据返回."_id"键是不会返回的

db.users.findOne({"name":"refactor"},{"age":1,"sex":1,"_id":0})

3.查询条件

"$lt","$lte","$gt","$gte"分别对应<,<=,>,>=

如:

查询age >=18  <=30

db.users.find({"age":{"$gte":18,"$lte":30}})

向文档增加键birthday

db.users.update(

  {"name":"refactor"},

  {

    "$set":

    {

      "birthday":new Date("1989/10/26")

    }

  }

)

查询birthday日期是1990-1-1之前的人

db.users.find({"birthday":{"$lt":new Date("1990/01/01")}})

使用"$ne"

查出所有name不等refactor1的文档,注意 文档中不存在键name的文档也会被查出来

db.users.find({"name":{"$ne":"refactor1"}})

使用or查询

MongoDB可以使用"$in","$or"

使用"$in"  www.2cto.com

查询出pageViews为10000,20000的数据

db.users.find({pageViews:{"$in":[10000,20000]}})

"$in"可以指定不同类型的条件和值,如正在将用户的ID号迁移成用户名的过程中,要做到两者兼顾的查询:

db.users.find({"user_id":{"$in":[12345,"refactor"]}})

这会匹配user_id为12345和"refactor"的文档.

要是 "$in"的数组只有一个值和直接匹配这个值效果是一样的.

db.users.find({"pageViews":{"$in":[10000]}})

db.users.find({"pageViews":10000})

使用"$nin"返回与数组中所有条件都不匹配的文档

如 查出所有pageViews不等10000,20000的文档,注意 文档中不存在键pageViews的文档也会被查出来

db.users.find({"pageViews":{"$nin":[10000,20000]}})

"$in"能对单个键进行or查询.

使用"$or"

db.users.find(

  {

    "$or":

    [

      {"pageViews":{"$in":[10000,20000]}},

      {"url":"http://www.cnblogs.com/refactor"}

    ]  www.2cto.com

  }

)

这将查询出pageViews是10000,20000或url是http://www.cnblogs.com/refactor的文档.

注意:使用普通的and查询时,要尽量将最苛刻的条件放在前面.

使用"$not"

"$not"可以用在任何条件之上.

如:

db.users.find(

  {"id_num":{"mod":[5,1]}}

)

这会查询出id_num取模后值为1的文档.

db.users.find(

  {"id_num":{"$not":{"mod":[1,5]}}}

)

4.条件句的规则

在查询中,"$lt"在内层文档,在更新中"$inc" 是外层文档的键.

条件句是内层文档的键,修改器是外层文档的键.

可对一个键应用多个条件,但一个键不能对应多个更新修改器.

www.2cto.com

5.特定于类型的查询

null可以匹配自身,而且可以匹配"不存在的"

能查出url 是"http://www.cnblogs.com/refactor",pageViews为null的文档

db.users.find({"url":"http://www.cnblogs.com/refactor","pageViews":null})

能查出pageViews为null的文档,不存在键pageViews的也能查出来

db.users.find({"pageViews":null})

能查出url 是"http://www.cnblogs.com/refactor",pageViews为null的文档,但不能查出不存在键pageViews的的文档

db.users.find({"url":"http://www.cnblogs.com/refactor","pageViews":{"$in":[null],"$exists":true}})

MongoDB没有"$eq"操作符,但是只有一个元素的"$in"的操作效果是一样的

如果仅仅想要匹配键值为null的文档,既要检查该键的值是否为null,还要通过"$exists"条件判断该键是不是存在.

6.正则表达式

正则表达式能够灵活有效的匹配字符串.

查找所有名包含refact或Refact的用户,使用正则表达式执行忽略大小写的匹配

db.users.find({"name":/refact/i})

系统可以接受正则表达式标识(i),但不是一定有.现在匹配了各种大小写形式的refact.

MongoDB可以为前缀型正则表达式(如:/^refactor/)查询创建索引.所以这种类型的查询非常高效.

正则表达式也可以匹配自身

db.users.find({"name":/refact/})

可以查出name为/refact/的文档.

www.2cto.com

7.查询数组

数组很大多数情况下可以这样理解:每一个元素都是整个键的值.

db.users.findOne({"userName":"refactor","emails":"295240648@qq.com"})能匹配到

使用"$all"

如果需要多个元素来匹配数组,就要用"$all"

db.users.insert({"userName":"refactor",emails:["295240648@qq.com","295240648@163.com","295240648@126.com"]})

db.users.insert({"userName":"refactor",emails:["295240648@qq.com","295240648@126.com","295240648@111.com"]})

db.users.insert({"userName":"refactor",emails:["295240648@126.com","295240648@163.com","295240648@111.com"]})

要找到邮箱有"295240648@163.com"又有"295240648@126.com",顺序无关紧要的文档

db.users.find(

  {

    "emails":

    {

      "$all":

      [

        "295240648@163.com",

        "295240648@126.com"

      ]  www.2cto.com

    }

  }

)

要是只对一个元素的数组使用"$all"就和不用"$all"是一样的,如

db.users.find({"emails":{"$all":["295240648@126.com"]}})

db.users.find({"emails":"295240648@126.com"})

效果是一样的.

也可以精确的匹配数组

db.users.find({"userName":"refactor",emails:["295240648@qq.com","295240648@163.com","295240648@126.com"]})

若想查询数组指定位置的元素,需要使用key.index语法指定下标

db.users.find({"emails.1":"295240648@163.com"})

使用"$size"

"$size"可以查询指定长度的数组

查询数组长度为3的数组

db.users.find({"emails":{"$size":3}})

常见的查询是数组长度范围的查询."$size"并不能与其他查询子句组合(如:"$gt"),但是这种查询可以通过

在文档中添加一个"size"键的方式来实现.这样每一次向指定数组添加元素的时候,同时增加"size"值.原来这样

的更新:

db.users.update({"$push":{"emails":"295240648@139.com"}})

变成这样的更新:  www.2cto.com

db.users.update({"$push":{"emails":"295240648@139.com"},"$inc":{"size":1}})

这样就可以这样查询了

db.users.find({"size":{"$gt":3}})

使用"$slice"查询

find的第二个参数是可选的,可以指定返回那些键,"$slice"返回数组的一个子集合

返回emails数组的前两个元素

db.users.find({"userName":"refactor"},{"emails":{"$slice":2}})

返回emails数组的后两个元素

db.users.find({"userName":"refactor"},{"emails":{"$slice":-2}})

返回emails数组的第2个和第11个元素.如果数组不够11个,则返回第2个后面的所有元素

db.users.find({"userName":"refactor"},{"emails":{"$slice":[1,10]}})

"$slice"默认将返回文档中的所有键.

转载于:https://blog.51cto.com/rmlifejun/1424696

MongoDB查询(上)相关推荐

  1. mysql数据库查上一条下一条记录,mongodb查询当前记录的上一条和下一条

    前言 本博客是很久之前搭建的.前台模板也是很久之前写的,技术方面难免有些过时.代码书写的也比较乱.博客能保持到现在,还多谢各位同学不断的提意见和建议!前几天有同学提出,看博客比较费劲,能否新增上一篇文 ...

  2. mongodb不等于某个值_MongoDb进阶实践之四 MongoDB查询命令详述

    一.引言 上一篇文章我们已经介绍了MongoDB数据库的最基本操作,包括数据库的创建.使用和删除数据库,文档的操作也涉及到了文档的创建.删除.更新和查询,当然也包括集合的创建.重命名和删除.有了这些基 ...

  3. mongodb 查询效率_2020年9个好用的MongoDB 图形化界面工具

    市场上有许多MongoDB管理工具.这些工具可以提高MongoDB开发和管理的效率.下面我们就列举一些2020年好用的mongo管理工具. 1)NoSQLBooster 用于MongoDB的NoSQL ...

  4. Mongodb查询分析器解析

    Mongodb查询分析器 动态相关项目中涉及到数据量大和吞吐量的接口,例如关注页面动态,附近动态,这部分数据都是存储在mongodb中,在线上数据中分类两个mongodb集合存储 其中关注动态基于扩散 ...

  5. MongoDB查询实现 笛卡尔积,Union All 和Union 功能

    转载自   MongoDB查询实现 笛卡尔积,Union All 和Union 功能 此篇文章及以后的文章大部分都是从聚合管道(aggregation pipeline)的一些语法为基础讲解的,如果不 ...

  6. mongodb查询分页优化

    mongodb查询分页优化 转自:https://blog.csdn.net/chunqiuwei/article/details/11669885 项目中需要用mongodb来进行数据测存储和查询, ...

  7. mongodb查询大全mongo语句

    mongodb查询大全mongo语句 一.前言 虽然这些语句在开发当中不会使用,因为springdataMongoDB封装的非常完美了.但是这里的语句思想和关系型数据库有些区别,所以需要拿出来详细的讲 ...

  8. Mongodb查询语句与Sql语句对比

    左边是mongodb查询语句,右边是sql语句.对照着用,挺方便. db.users.find() select * from users db.users.find({"age" ...

  9. mongodb查询内嵌文档

    mongodb查询内嵌文档 假设有这样一个文档: db.XXX.remove(); db.XXX.insert({"id":1, "members":[{&qu ...

最新文章

  1. 2.7 程序示例--多分类问题-机器学习笔记-斯坦福吴恩达教授
  2. 这些IT圈里的名词,你读对了吗
  3. 开源项目管理软件禅道使用帮助下载
  4. java中统计括号配对_括号配对问题(C语言或JAVA语言代码)
  5. ASP正则表达式方面小笔记
  6. LeetCode 1471. 数组中的 k 个最强值(排序)
  7. Linux Vi的使用
  8. 【算法分析与设计】实验 分治算法解决中位数问题
  9. pycharm-python文件注释头
  10. 回溯算法——复原IP地址(Leetcode 93)
  11. k8s ready 不调度_【零基础学云计算】k8s部署---master节点组件部署(三)
  12. UnityWebRequest下载文件
  13. 五子棋初步以及对五子棋的局面估值
  14. SiteMesh3简介及使用
  15. php实现mpg自动提取音轨,视频如何导出音轨 怎么将双音轨mpg提取其中一个音轨保存...
  16. There was a problem confirming the ssl certificate: [SSL: CERTIFICATE_VERIFY_FAILED]
  17. java如何找出勾股数组_勾股数组 学习笔记
  18. OpenStack-M版(Mitaka)搭建基于(Centos7.2)+++十、Openstack对象存储服务(swift)中
  19. StringTokenizer类详解
  20. Vanish/squid

热门文章

  1. 计算机怎样调整工作表位置,图表布局中调整图表大小和位置及跨工作表移动——想象力电脑应用...
  2. git 如何清理操作日志_git如何清空所有的commit记录
  3. SCI论文写作--中科院自动化所牛博士教你如何搞科研
  4. Quartus下载 安装 与 和谐教程
  5. 光流 | OpenCV实现简单的optical flow(代码类)
  6. C++文件读写详解(ofstream,ifstream,fstream)
  7. 损失函数|交叉熵损失函数
  8. Unity3D的一些坑
  9. 【学术相关】Github大盘点!2021年最值得推荐的38篇AI论文
  10. 【Python】pandas一行代码绘制26种美图