2019独角兽企业重金招聘Python工程师标准>>>

find介绍

MongoDB中使用find来进行查询。查询就是返回一个集合中文档的子集,子集得范围从0个文档到整个集合。find得第一个参数决定要返回哪些文档,这个参数是一个文档,用于指定查询条件。

空得查询文档{}默认返回全部内容。 如:db.blog.find() 或者db.blog.find({"name":"zhangsan","age":20})

指定需要返回的键

有时候并不需要将文档中所有的键/值对都返回。我们可以通过设置第二个参数来指定想要的键,这样会介绍传输的数据量,又能节省客户端解析文档的时间和内存消耗。

如:db.blog.find({},{"username":1,"email":1})

默认情况下,“_id”这个键总是被返回的。

也可以使用第二个参数来剔除查询结果中得某些键值对。如 db.blog.find({},{"delFlag":0})

限制

查询时候有些限制,传递给数据库的查询文档的值必须是常量,不能是阴影文档中其他键的值。

查询条件

基本操作符

"$lt","$lte","$gt","$gte"等价于"<","<=",">",">=",是比较操作符。我们可以将操作符组合起来使用。

如:查询10-20岁的用户

db.user.find({"age"{"$gte":10,"$lte":20}})

查询2015年10月1日前注册的用户

   start = new Date("01/10/2015")db.user.find({"registeDate":{"$lt":start}})

对于文档中键值不等于某个特定值得情况,就要使用另外一个条件操作符“$ne”,表示不相等。

查询用户名字不是“liming”的人。

db.user.find({"name":{"$ne":"liming"}})

OR查询条件

MongoDB中有2中方式进行or查询:“$in”可以用来查询一个键得多个值;“$or”可以在多个键中查询任意给定值。

一个键匹配多个值。

db.user.find({"no":{"$in":[1,23,55,66,78]}})

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

db.user.find({"no":{"$nin":[1,23,55,66,78]}})

"$or"可以接受一个包含可能条件的数组作为参数

db.user.find({"or":[{"no":12},{"age":20}]})
db.user.find({"or":[{"no":{"$in":[1,2,3,4]}},{"age":20}]})

$not

"$not"是元条件句,可以用在任何其他条件之上。

如取模运算符“$mod”,将会查询的值除以第一个给定值,若余数等于第二个给定值则匹配成功。

db.user.find({"no"{"$mod":[5,1]}})

返回结果是no的值是1,6,11,16等。如果要返回2,3,45,等用户就要使用$not

db.user.find({"no"{"$not":{"$mod":[5,1]}}})

条件语义

对比前面更新修改器和查询文档,我们会发现以“$”开头的键位于在不同的位置。再查询中“$lt”再内层文档,更新中'$inc"则在外层文档。

一个键可以有任意多个条件,但是一个键不能对应多个更新修改器。

一些“元操作符”也位于外层文档,如“$and”、“$or”、“$nor”

db.user.find({"$and":[{"x":{"$lt":1}},{"x"4}]})

特定类型查询

null类型

 db.user.find({"name":null})

如果文档中存在name键为null得文档,则会列出该文档。如果不存在,则列出缺少这个键的所有文档。

正则表达式

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

查询数组

$all

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

    db.food.find({"fruit":{"$all":["a","b"]}})

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

db.food.find({"fruit.2":"a"})

数组下标都是从0开始,所以上面的表达式会翻红数组第3个元素和“a”进行匹配。

$size

用来查询特定长度的数组

 db.food.find({"fruit":{"$siez":3}})

$slice

该操作符可以返回某个键匹配的数组元素的一个子元素。

如:需要返回博客前面10条评论

db.blog.findOne({},{"comments":{"$slice":10}})

需要返回博客后面10条评论

db.blog.findOne({},{"comments":{"$slice":-10}})

也可以指定偏移值以及希望返回的元素数量,来返回元素集合中间位置的某些结果

db.blog.findOne({},{"comments":{"$slice":[30,10]}})

查询内嵌文档

2种方法:查询整个文档或者只针对其键值对进行查询。

$where 查询

使用$where可以在查询中执行任意的js。这样就可以在查询中几乎任何事情,为了安全,应该严格限制或是消除$where语句的使用。

$where查询在速度上要比常规的查询慢,每个文档都有从BSON转换成js对象,然后通过$where表达式来运行,且$where语句不能使用索引。

游标

数据库使用游标返回find得执行结果,客户端对游标得实现通常能够对最终结果进行有效控制。

执行查询,分配一个局部变量

var cursor = db.collection.find();

如果没有把结果放在全局变量或者变量中,MongoDB shell回自动迭代,自动显示若干文档。

要迭代结果,可以使用游标得next方法,也可以使用hasNext来查看游标中是否还有其他结果。

while(cursor.hasNext()){
obj = cursor.next();
}

游标还实现了js得迭代器接口,我们也可以使用forEach再循环中使用。

cursor.forEach(function(x){
print(x.x);
})

调用find时,shell并不立即查询数据库,而是等待真正开始要求获得结果时才发送查询,这样再执行查询前可以给查询附加额外的选项。几乎游标对象的美俄方法都返回游标本身,这样就可以按任意顺序组成方法链。

再这之前都是构造查询。执行cursor.hasNext(),查询被发到服务器。shell立刻获取前面100个结果或者4MB数据,这样下次调用net或者hasNet就不用再连接服务器取结果,客户端用完第一组结果,shell才会再次联系数据库,使用getMore请求提取更多结果,如果有则返回下一批结果,这个过程会一直持续直到游标耗尽或者取完全部结果。

limit、skip、sort

最常用得查询选项就是限制返回结果的数量、忽略一定数量的结果以及排序。这些选项要在查询被发送到服务器之前指定。

限定结果数量,只返回10个结果

db.user.find().limit(10)

略过结果,忽略前面5个匹配的文档,返回剩下的文档

db.user.find().skip(5)

sort接受一个对象作为参数,这个对象是一组键值对,键对应文档的键名,值代表排序方向,1代表升序,-1代表降序,如果指定多个键则安装指定顺序逐个排列。

db.user.find().sort({"userName":1,"age":-1})

可以组合使用,针对分页效果大大的好

如搜索MP3,每页返回50个记录,价格按照高到低排序

db.shop.find({"name":"mp3"}).limit(50).sort({"price":-1})

下一页查看更多

db.shop.find({"name":"mp3"}).limit(50).skip(50).sort({"price":-1})

避免使用skip略过大量结果

到时候再开一篇写

高级查询

游标生命周期

在服务端,游标消耗内存和其他资源。游标遍历尽了结果以后,或者客户端发来消息要终止,数据库将会释放这些资源。释放的资源会被数据库另用,所以要保证尽快释放游标。

特殊情况游标终止,随后会被自动清理。

游标完成匹配结果迭代,会清除自身。

客户端游标不在作用域,驱动程序会向服务端发送特别消息让其销毁。

游标10分钟内没有使用也会自动销毁。

转载于:https://my.oschina.net/ihanfeng/blog/538933

【MongoDB系列】:MongoDB 查询应用相关推荐

  1. MongoDB系列4——查询操作符

    查询和计划操作符 文章目录 查询和计划操作符 一.评价查询操作符 1.使用`$mod`进行模运算查询 2.使用`$regex`进行模糊查询 3.使用`$text`对有`text`索引的字段进行模糊查询 ...

  2. mongodb系列~mongodb慢语句(2)

    一简介:今天遇到一个慢日志的排查和解决过程 二 版本:3.0.6 三 架构:分片集群 四 具体过程 1 程序响应很慢,具体日志寻找定点sql(mongodb慢日志记录在log日志里) awk '$NF ...

  3. mongodb系列~mongodb的副本集搭建和原理

    一 简介: mongodb副本集 二 复制方式: 1 全量复制 2 增量复制 三 同步检测过程:     一 正常情况下:        1 master执行语句,并将所有的修改数据库的操作以日志Op ...

  4. Python3 爬虫学习笔记 C11【数据储存系列 — MongoDB】

    Python3 爬虫学习笔记第十一章 -- [数据储存系列 - MongoDB] 文章目录 [11.1]关于 MongoDB [11.2]MongoDB 基本操作语句 [11.3]连接 MongoDB ...

  5. MongoDB文档查询操作(三)

    关于MongoDB中的查询,我们已经连着介绍了两篇文章了,本文我们来介绍另外一个查询概念游标. 本文是MongoDB系列的第七篇文章,了解前面的文章有助于更好的理解本文: 1.Linux上安装Mong ...

  6. MongoDB文档查询操作(一)

    上篇文章我们主要介绍了MongoDB的修改操作,本文我们来看看查询操作. 本文是MongoDB系列的第五篇文章,了解前面的文章有助于更好的理解本文: 1.Linux上安装MongoDB 2.Mongo ...

  7. MongoDB:mongodb在项目开发时的安全验证、分页查询操作

    MongoDB:mongodb在项目开发时的安全验证.分页查询操作. 对于数据库而言,在项目应用中都需要安全验证,不然,就会报错,呵呵-- 现在贴出来我在项目中是怎么做的. 原创文章,转载请注明出处: ...

  8. MongoDB 进阶-关联查询

    [苏州需要工作的加我QQ,内推介绍费平分] MongoDB 进阶 1.数据库命令 a.命令的工作原理 drop命令,在shell中删除一个集合,执行db.refactor.drop().其实这个函数实 ...

  9. mongodb系列教程

    mongodb系列教程 ttlsa教程系列之mongodb-(一)mongodb介绍 ttlsa教程系列之mongodb--(二)mongodb安装 ttlsa教程系列之mongodb--(三)mon ...

  10. MongoDB自定义条件查询案例

    MongoDB自定义条件查询案例

最新文章

  1. 注意了,又有企业因BTC费用高转向BCH
  2. 安全框架 - Shiro与springMVC整合的注解以及JSP标签
  3. vim编辑器基础知识总结
  4. Linux命令之tar等
  5. 前端学习(1847)vue之电商管理系统电商系统的功能划分
  6. 拯救者r7000怎么关闭触控板_联想拯救者R7000(2020版)上手体验,有没有AMD Yes?
  7. Codeforces Round #315 (Div. 2C) 568A Primes or Palindromes? 素数打表+暴力
  8. 37. 两个链表的第一个公共节点(C++版本)
  9. SHELLEXECUTEINFO,ShellExecuteEx
  10. 【office卸载】如何彻底卸载office2016
  11. 三、GTK-按钮(微调按钮、复选按钮、单选按钮)、快捷键、热键
  12. Difference between Vienna DL LLS and UL LLS
  13. 二次函数顶点式计算机,二次函数公式:顶点式、交点式、两根式
  14. 2022全国大学生数学建模竞赛
  15. 04-dropbear
  16. linux命令详解之cd命令
  17. 有关于Boolean的使用
  18. html5手机视频直播
  19. Java中的jar包下载地址整理
  20. 中国矿产资源产业规划与投资前景预测分析报告2022-2027年

热门文章

  1. Linux修改主机名称
  2. js如何判断访问来源是来自搜索引擎(蜘蛛人)还是直接访问
  3. VMware快照功能与(非永久)永久磁盘详解
  4. Linux系统启动流程图
  5. 微服务(接口)设计原则
  6. Linux 命令(5)—— shutdown 命令
  7. 10 mysql选错索引
  8. windows mysql导入sql文件
  9. mongodb E11000 duplicate key error collection: index: _id_ dup key
  10. pytorch版本问题:AttributeError: 'module' object has no attribute '_rebuild_tensor_v2'