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

摘要:
语法:[sql]viewplaincopydb.collection.findOne参数类型描述querydocument可选.使用查询操作符指定查询条件projectiondocument指定使用投影运算符返回的字段省略此参数返回匹配文档中的所有字段Projection语法:[sql]viewplaincopy{field1:,field2:...}说明:1或者true表示返回字段0或者false表示不返回该字段先插入数据[sql]viewplaincopy˃db.orders.insert我们用db.orders.find()查询时返回多条记录[sql]viewplaincopy˃db.orders.find我们执行db.orders.findOne()时,只返回第一条记录例子:[sql]viewplaincopy˃db.orders.findOne二、游标的遍历db.collection.find()可以实现根据条件查询和指定使用投影运算符返回的字段省略此参数返回匹配文档中的所有字段。输入“it”后会显示后二十条的数据。
转自:http://blog.csdn.net/congcong68/article/details/46933609 一、简介

db.collection.find()可以实现根据条件查询和指定使用投影运算符返回的字段省略此参数返回匹配文档中的所有字段。并返回到匹配文档的游标,可以随意修改查询限制、跳跃、和排序顺序的功能。

二、db.collection.findOne ()

db.collection. findOne ()返回满足指定查询条件的文档。如果多个文档满足查询,该方法返回第一个文档,根据自然顺序返回文件在磁盘上的顺序,在覆盖的集合中,自然顺序与插入顺序相同。

语法:

  1. db.collection.findOne(query,projection)

参数

类型

描述

query

document

可选. 使用查询操作符指定查询条件

projection

document

指定使用投影运算符返回的字段省略此参数返回匹配文档中的所有字段

Projection语法:

  1. {field1:<boolean>,field2:<boolean>...}

说明:

1或者true表示返回字段

0或者false表示不返回该字段

先插入数据

  1. >db.orders.insert([
  2. {
  3. "onumber":"001",
  4. "date":"2015-07-02",
  5. "cname":"zcy1",
  6. "items":[{
  7. "ino":"001",
  8. "quantity":2,
  9. "price":4.0
  10. },{
  11. "ino":"002",
  12. "quantity":4,
  13. "price":6.0
  14. }
  15. ]
  16. },{
  17. "onumber":"002",
  18. "date":"2015-07-02",
  19. "cname":"zcy2",
  20. "items":[{
  21. "ino":"001",
  22. "quantity":2,
  23. "price":4.0
  24. },{
  25. "ino":"002",
  26. "quantity":6,
  27. "price":6.0
  28. }
  29. ]
  30. }
  31. ])

我们用db.orders.find()查询时返回多条记录

  1. >db.orders.find({"date":"2015-07-02"})

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

我们执行db.orders.findOne()时,只返回第一条记录

例子:

  1. <spanstyle="font-size:18px;">>db.orders.findOne({"date":"2015-07-02"})</span>

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

二、游标的遍历

db.collection.find()可以实现根据条件查询和指定使用投影运算符返回的字段省略此参数返回匹配文档中的所有字段。并返回到匹配文档的游标,可以随意修改查询限制、跳跃、和排序顺序的功能。

1、我们先通过javascript脚本向集合中填充10000条文档,然后执行db.collection.find()执行查询文档

  1. >for(vari=0;i<10000;i++){
  2. ...db.items.insert({"ino":i,"quantity":i});
  3. ...}
  4. WriteResult({"nInserted":1})
  5. >db.items.find()
  6. {"_id":ObjectId("55a66f3c7db4e9f2ef681076"),"ino":0,"quantity":0}
  7. {"_id":ObjectId("55a66f3c7db4e9f2ef681077"),"ino":1,"quantity":1}
  8. {"_id":ObjectId("55a66f3c7db4e9f2ef681078"),"ino":2,"quantity":2}
  9. {"_id":ObjectId("55a66f3c7db4e9f2ef681079"),"ino":3,"quantity":3}
  10. {"_id":ObjectId("55a66f3c7db4e9f2ef68107a"),"ino":4,"quantity":4}
  11. {"_id":ObjectId("55a66f3c7db4e9f2ef68107b"),"ino":5,"quantity":5}
  12. {"_id":ObjectId("55a66f3c7db4e9f2ef68107c"),"ino":6,"quantity":6}
  13. {"_id":ObjectId("55a66f3c7db4e9f2ef68107d"),"ino":7,"quantity":7}
  14. {"_id":ObjectId("55a66f3c7db4e9f2ef68107e"),"ino":8,"quantity":8}
  15. {"_id":ObjectId("55a66f3c7db4e9f2ef68107f"),"ino":9,"quantity":9}
  16. {"_id":ObjectId("55a66f3c7db4e9f2ef681080"),"ino":10,"quantity":10}
  17. {"_id":ObjectId("55a66f3c7db4e9f2ef681081"),"ino":11,"quantity":11}
  18. {"_id":ObjectId("55a66f3c7db4e9f2ef681082"),"ino":12,"quantity":12}
  19. {"_id":ObjectId("55a66f3c7db4e9f2ef681083"),"ino":13,"quantity":13}
  20. {"_id":ObjectId("55a66f3c7db4e9f2ef681084"),"ino":14,"quantity":14}
  21. {"_id":ObjectId("55a66f3c7db4e9f2ef681085"),"ino":15,"quantity":15}
  22. {"_id":ObjectId("55a66f3c7db4e9f2ef681086"),"ino":16,"quantity":16}
  23. {"_id":ObjectId("55a66f3c7db4e9f2ef681087"),"ino":17,"quantity":17}
  24. {"_id":ObjectId("55a66f3c7db4e9f2ef681088"),"ino":18,"quantity":18}
  25. {"_id":ObjectId("55a66f3c7db4e9f2ef681089"),"ino":19,"quantity":19}
  26. Type"it"formore
  27. >

我们db.collection.find()执行查询文档时,发现Mongo shell如果没有分配给一个使用var关键字的变量迭代数据时,光标自动迭代前20个文档的结果返回。

输入“it”后会显示后二十条的数据。

2、你可以使用DBQuery.shellbatchsize改变迭代次数(每页就显示10条记录)

例子:

  1. >DBQuery.shellBatchSize=10

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

现在光标自动迭代前10个文档的结果返回

3、我们定义一个变量来保存这个游标

例子:

  1. >varcursor=db.items.find()

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

用一个变量来保存游标,不会自动输出数据的,需要我们自己实现这个查询结果的游标进行遍历。

4、对游标进行遍历

  1. >varcursor=db.items.find()
  2. >while(cursor.hasNext()){
  3. vardoc=cursor.next();
  4. printjson(doc);
  5. };

或者

forEach()循环遍历:

  1. >cursor.forEach(function(doc){printjson(doc);});

当你遍历游标到返回的批处理结束,如果有更多的结果,cursor.next()将执行更多的操作来获取下一批。

MongoDB服务器返回的查询结果, 当调用cursor.hasNext()时,MongoDB批量的大小不会超过最大BSON文档大小,然而对于大多数查询,第一批返回101文档或足够的文件超过1 MB,后续的批大小为4 MB。如果第一批是返回101个文档时,遍历完时,执行hasNext,会到数据库查询结果,直到所有结果都被返回,游标才会结关闭。

我们可以通过可以使用objsleftinbatch()方法来查看,每次返回文档数量或者大小,如下面的例子:

  1. >varcursor=db.items.find()
  2. >cursor.objsLeftInBatch();

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

当我们刚执行查询时,执行cursor .objsLeftInBatch();方法会显示101 ,这说明第一批返回101文档(101文档没超过1MB)

我们遍历完101个文档时,当我们执行cursor.hasNext()时,第二批会在返回101文档吗?

我们先遍历完101个文档,如下面的例子:

  1. >for(vari=0;i<101;i++){
  2. vardoc=cursor.next();
  3. printjson(doc);
  4. }

这时我们迭代完第一批返回的结果,我们在执行cursor.hasNext();时,会到数据库查询下一批结果,我们objsLeftInBatch方法查看返回文档大小,如下面的例子:

  1. >cursor.hasNext();
  2. >cursor.objsLeftInBatch();

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

这时返回的结果是 9899, 不在是101个文档,而是4 MB,我们9899个文档没达到4MB,所有全部返回。

说明:

MongoDB使用的是内存映射存储引擎,它会把磁盘IO操作转换成内存操作,如果是读操作,内存中的数据起到缓存的作用。查询时,实现分批次返回结果,这是一个懒加载的过程,需要时才到数据库查询下一批结果,这会节省资源,不会浪费资源。

三、游标的操作

我们还可以对文档的游标,可以随意修改返回结果的限制、跳跃、和排序顺序的功能。

1. limit

limit方法是限制游标返回结果的数量,如下面例子:

  1. >db.items.find().limit(5)

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

只返回结果5条文档

2.sort

sort()方法来对数据进行排序,根据指定的字段,并使用1或-1来指定排序方式是升序或降序,类似于SQL的order by。

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

例子:

  1. >db.items.find({"ino":{$lt:5}}).sort({"quantity":-1})

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

我们查询ino小于5,并对这结果进行排序,按quantity字段降序。

我们可以指定多个字段排序,例如我们先按quantity字段降序,然后在按info升序,如下面的例子:

  1. >db.items.find({"ino":{$lt:5}}).sort({"quantity":-1,"info":1})

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

我们查询ino小于5,并对这结果进行排序,按quantity字段降序

我们还可以跟limit()方法进行组合查询并对结果进行排序

例子:

  1. >db.items.find().limit(3).sort({"quantity":1})
MongoDB查询(游标操作、游标信息)第11张

我们先根据quantity字段升序并返回前3条记录,发现没有键quantity(即键quantity值为null)的文档排在了前面,这是在MongoDB中,当比较不同类型值BSON,MongoDB使用以下比较顺序,从最低到最高:

  1. MinKey (internal type)
  2. Null
  3. Numbers (ints, longs, doubles)
  4. Symbol, String
  5. Object
  6. Array
  7. BinData
  8. ObjectId
  9. Boolean
  10. Date
  11. Timestamp
  12. Regular Expression
  13. MaxKey (internal type)

对于包括一个没有索引的排序操作的查询,服务器必须在返回任何结果之前将所有的文档加载到内存中来进行排序。

3、skip

skip方法可以跳过指定值的条数,返回剩下的条数的结果,可以跟limit()方法进行组合可以实现分页的效果。

例子:

  1. >db.items.find().skip(10).limit(10)

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

跳过第10条,从第11条开始返回,只返回10条文档.

skip方法是跳过条数,而且是一条一条的跳过,如果集合比较大时(如书页数很多)skip会越来越慢, 需要更多的处理器(CPU),这会影响性能。

我们可以通过一个键值比较有顺序的来进行分页,这样就避免使用skip方法。

例子:

  1. >db.items.find({"ino":{$lt:20,$gt:9}}).sort({"info":1})

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

四、游标的说明

默认情况下,服务器将自动关闭该游标10分钟后闲置或客户端遍历完结果的游标。需要手动关闭游标或清除游标是,可以在查询中使用光标指定noTimeout标记。通过 cursor.addOption(),通过这个方法,如下面的例子:

  1. >varcursor=db.items.find().addOption(DBQuery.Option.noTimeout);

可以查看游标信息:

(1) 打开的游标的总数

(2)当前客户端使用的游标大小

(3)自上次重新启动服务器的超时游标数量


我们可以查看,了解游标使用情况

如下面的例子:

  1. >db.serverStatus().metrics.cursor

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

免责声明:文章转载自《MongoDB查询(游标操作、游标信息)》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇添加自签发的 SSL 证书为受信任的根证书Endnote在latex中的应用的两种方法下篇

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

相关文章

通过PEB遍历当前进程中的模块(C语言实现)

0x00 相关说明:Windows应用层如果要遍历当前进程所加载的模块可以使用WIN32API通过进程快照来实现 通过PEB来遍历进程模块没有WIN32API的使用痕迹,在某些场合更加好用 其中32位应用程序的PEB 的地址可以通过 fs:[0x30]获取,fs:[0]为TEB结构的地址 0x01 相关数据结构:下面的数据结构可以在windbg中使用命令查...

MongoDB可视化客户端Studio 3T破解

解决studio 3T时间到期的两种方法此教程并非真正破解,而是通过重置studio 3t的试用时间解决的。 第一种方法按住运win 和 r 键输入 regedit 找到以下路径HKEY_USERSS-1-5-21-xxxxxxxxxxxxxxSOFTWAREJavaSoftPrefs3tmongochefenterprise 将除了 installati...

oracle--pl/sql变量定义----

一、变量介绍 在编写pl/sql程序时,可以定义变量和常量;在pl/sql程序中包括有: 1)、标量类型(scalar) 2)、复合类型(composite) --用于操作单条记录 3)、参照类型(reference) --用于操作多条记录 4)、lob(large object) 二、标量(scalar)——常用类型 1)、在编写pl/sql块时,如果...

DB2错误代码/SQL返回码信息对照

用COBOL链接DB2时,出现DB2错误信息时,如果你不懂代码是什么意思,可以用这份资料查找, 当然你也可以直接在db2的命令行下输入:db2 ? SQL30081N,系统会给出一些提示信息. sqlcode sqlstate DB2错误信息(按sqlcode排序) 000 00000 SQL语句成功完成 01xxx SQL语句成功完成,但是有警告 +01...

Iterator迭代器与增强for循环

java中提供了很多个集合,它们在存储元素时,采用的存储方式不同。我们要取出这些集合中的元素,可通过一种通用的获取方式来完成。 Collection集合元素的通用获取方式:在取元素之前先要判断集合中有没有元素,如果有,就把这个元素取出来,继续在判断,如果还有就再取出出来。一直把集合中的所有元素全部取出。这种取出方式专业术语称为迭代。 集合中把这种取元素的方...

第七部分(三) 动态渲染页面爬取(用Selenium获取淘宝商品,不涉及验证登录)

三、 使用 Selenium 爬取淘宝商品在分析 Ajax 抓取相关数据时,不是所有页面都可以通过分析 Ajax 来完成抓取。比如淘宝的整个页面数据确实是通过 Ajax 获取的,但这些 Ajax 接口参数复杂,并且包含有加密密钥等,如果要构造 Ajax 参数是很困难。像这种页面最方便的抓取方法是通过 Selenium 。接下就用 Selenium 模拟浏览...