`
eksliang
  • 浏览: 599631 次
  • 性别: Icon_minigender_1
  • 来自: 广州
社区版块
存档分类
最新评论

MongoDB查询(4)——游标和分页[八]

阅读更多

转载请出自出处:http://eksliang.iteye.com/blog/2177567

一、游标

        数据库使用游标返回find的执行结果。客户端对游标的实现通常能够对最终结果进行有效控制,从shell中定义一个游标非常简单,就是将查询结果分配给一个变量(用var声明的变量就是局部变量),便创建了一个游标,如下所示:

> var cursor = db.users.find()

       这么做的好处就是可以一次查看一条结果。如果将上面查询结果放在全局变量中或者根本就没有放在变量中,MongoDB shell会自动迭代,自动显示最开始的若干文档。

 

可以使用游标的next()方法获得下一条数据。使用hasNext()方法查看游标里面是否还有数据。

参考实例一:while迭代游标

var cursor = db.users.find().limit(10);
while(cursor.hasNext()){
	user=cursor.next();
	print(user.name);
}

 参考实例二:forEach迭代游标

var cursor = db.users.find().limit(10);
cursor.forEach(function(user){
	print(user.name);
});

       调用find()方法时,shell并不立即查询数据库,而是等待真正开始要求获得结果时才发送查询,这样在执行之前可以给查询附加额外的选项。几乎游标对象的每个方法都返回游标本身,这样就可以按任意顺序组成方法链。例如,下面几种表达式是等价的。

> var cursor=db.users.find().sort({"age":1}).limit(10).skip(10)
> var cursor=db.users.find().skip(10).limit(10).sort({"age":1})

       此时上面的查询还没有向数据库发送请求,他们只是在构造查询。现在,假设我们执行如下操作:

> cursor.hasNext()

      这时,查询被发往服务器。shell立刻获得100条数据或者前4M数据(两种之间取小者),这样下次调用next或者hasNext时就不必再次连接服务器获取结果了。当客户端用光了第一组结果,shell会再一次联系数据库。

 

二、游标的生命周期

       看待游标有两种角度:“客户端游标”以及“客户端请求过去的服务器端游标”,在服务器端,游标消耗内存和其他资源。所以我们讨论就讨论服务器端的,客户端的没有什么意义。当客户端向服务器发起一次查询find()就代表在服务器端创建了一个游标,下面三种情况会让游标销毁。

  • 当游标遍历尽了以后,或者客户端发来消息要求终止,数据库会释放这些资源。
  • 当客户端的游标不在作用域内时,驱动程序会向服务器发送一条特别消息,让其销毁游标。
  • 当服务器端10分钟以内不对游标进行操作,即使客户端游标在作用域内或者还没有迭代完,数据库也会自动销毁游标。

三.、imit、skip和sort

  • limit:用来限制返回的结果,返回匹配文档的上限
  • skip:跳过前面多少个文档
  • sort:  排序的参数

这些选项必须在查询发送到服务器之前指定

参考实例:分页查询users集合的第二页每页10条记录,并指定对age进行升序

> var cursor=db.users.find().skip(10).limit(10).sort({"age":1})
> cursor.forEach(function(user){
... print("userName:"+user.name+" age:"+user.age);
... });

 返回结果如下:

userName:user2088 age:11
userName:user2212 age:12
userName:user2371 age:13
userName:user2655 age:14
userName:user2681 age:15
userName:user2855 age:16
userName:user3186 age:17
userName:user3332 age:18
userName:user3383 age:19
userName:user3465 age:20

 

 

 四、怎么对mongodb进行分页

      当使用skip略过少量文档还是不错的。但是要是数量非常多的话,skip会变得相当慢,例如想返回第10000页(每页20条记录),MongoDB必须先找到200000条记录,然后再抛弃199920条数据,这种分页需求在业内也有一个名词叫做“深分页”。大多数数据库都会再索引中保存更多的元数据,用于处理skip(Solr 4.7.1也引入了游标处理这种深分页),所以要尽量避免滤过太多数据。

 

既然MongoDB的skip不适合做深分页,那怎么做呢?

答:MongoDB能不能做深分页这取决于查询本身。

根据一般业务来讲,可以找到一种方法在不使用skip的情况下实现分页,这主要取决于查询本身。

参考实例

例如要按照"date"降序显示文档列表。可以按照如下方式获取结果的第一页:

> db.users.find().sort({"create":-1}).limit(10)

 然后利用上次查询的最后一个文档中的"date"值作为查询条件,来获取下一页:

var lastTime=users.last.date;--这个可以根据实际情况获得,我这里只是随便写写,让你感受到这种思想。

获取下一页:

db.users.find({"create":{"$gt":lastTime}}).sort("create":-1}).limit(10)

 这种分页查询中就没有了skip了。

 

优化深分页的核心思想(包括关系型数据库,以及其他NoSql数据库):减少当前查询在结果集里面存放的数据。

 

 

 

 

 

 

分享到:
评论

相关推荐

    读书笔记:《左手MongoDB右手Redis——从入门到商业实战》书籍配套源代码。.zip

    读书笔记:《左手MongoDB右手Redis——从入门到商业实战》书籍配套源代码。

    适用于java语言的MongoDB解决方案——Mongernate

    5. 支持集合分页:Mongernate提供了分页查询的能力,帮助开发者在处理大量数据时优化性能。 6. 自动类型转换:Mongernate可以自动将Java对象的属性转换为适合存储在MongoDB中的格式,反之亦然。 7. 支持实体关系:...

    基于c#的Mongodb帮助类源码 含一个分页效率测试

    总的来说,这个C# MongoDB帮助类源码提供了一种简洁的方式来处理MongoDB数据库操作,同时包含了一个有价值的性能测试,对于理解和优化MongoDB在C#环境中的分页策略非常有帮助。通过深入学习和实践,你可以更好地掌握...

    mongodb 数据库基本操作.doc

    MongoDB提供了强大的查询能力,支持多种查询操作符和条件。 - **使用`find`方法**:可以通过指定查询条件来过滤结果。 ```python results = collection.find({"age": {"$gt": 30}}) ``` 上述代码将返回年龄大于...

    java+mongodb+分页

    本篇文章将深入探讨如何使用Java与MongoDB进行数据分页查询,结合源码分析工具,帮助开发者更好地理解和应用这一技术。 首先,我们要了解的是MongoDB的基本概念。MongoDB是一个基于分布式文件存储的数据库,支持...

    MongoDB查询性能验证及优化

    在`DocTest.java`中,可能包含了一些文档操作和查询示例,通过分析这些代码,可以进一步识别性能瓶颈,进行相应的优化。 总的来说,MongoDB的查询性能验证和优化是一个综合性的过程,涉及到索引设计、查询编写、...

    mongodb数据库游标的使用浅析

    总的来说,MongoDB的游标是处理查询结果的关键工具,它不仅提供了灵活的数据遍历方式,还优化了内存使用,使得大数据集的处理变得高效和可控。理解和熟练使用游标是MongoDB开发中不可或缺的部分。

    MongoDB分页插件

    MongoDB分页插件是专为MongoDB数据库设计的一个实用工具,主要目的是为了方便开发者在进行数据查询时实现高效、灵活的分页功能。在Java开发中,数据库操作是不可或缺的一部分,而面对大量数据时,分页显示尤为重要,...

    MongoDB游标超时问题的4种解决方法

    MongoDB游标超时问题通常出现在使用游标迭代查询结果时,由于默认的游标超时设置(10分钟)限制,导致长时间未使用的游标失效。以下是对四种解决方法的详细阐述: 1. **修改MongoDB配置**: 这种方法涉及到更改...

    mongoDB-查询语法

    在 MongoDB 中,官方建议使用游标来实现分页,而不是使用 `skip()` 方法。例如,以下是一个高效的分页实现: ``` var page1 = db.users.find().sort({ insertTime: -1 }).limit(100); var lastest = null; while ...

    MongoDB的游标.pdf

    总的来说,MongoDB的游标机制提供了强大的查询控制能力,通过`limit`、`skip`和`sort`,用户可以灵活地处理查询结果,以适应不同的应用场景。熟练掌握这些技巧,对于优化查询性能和提高开发效率至关重要。在实际操作...

    30分钟学MongoDB系列 ——MongoDB的安全机制和高级管理篇

    MongoDB是当前流行的NoSQL数据库之一,它支持高性能、高可用性和易扩展的特性。在处理海量数据时,MongoDB提供了很多高级管理功能来确保数据的安全性和一致性。本篇将重点介绍MongoDB的安全机制和高级管理功能,包括...

    高效mongodb的php分页类(不使用skip).zip

    介绍了高效mongodb的php分页类,并且没有使用mongodb的skip来实现分页,需要的朋友可以参考下,mongodb分页skip limit分页要先查出所有结果再去跳过,这样如果查询页面越往后效率越低。 如果能够通过查询条件查出...

    MongoDB查询练习题及答案

    在本题中,我们将探讨 MongoDB 的查询操作,基于提供的 `user1` 和 `user2` 文档进行练习。 首先,让我们熟悉一下 `db.users.drop()` 命令。这个命令用于删除集合 `users`,如果存在的话。在 MongoDB 中,集合是...

    Java操作MongoDB模糊查询和分页查询

    在Java中操作MongoDB数据库时,我们经常需要执行模糊查询和分页查询来获取符合特定条件的数据,并且按需分页展示结果。本篇将详细讲解如何使用Java进行MongoDB的模糊查询和分页查询。 首先,让我们了解模糊查询。在...

    mongodb查询工具Studio3T

    如果您不习惯MongoDB查询语言,那么Studio3T的SQL查询可能会派上用场。编写SQL选择表达式和SQL联接来查询mongodb,并查看SQL查询如何转换为MQL——这是一个很好的工具。SQL查询语言

    NoSQL介绍PPT

    常见NoSQLj介绍——MongoDB 常见NoSQL介绍——MongoDB 常见NoSQL介绍——MongoDB 常见NoSQL介绍——MongoDB 常见NoSQL介绍——MongoDB 常见NoSQL介绍——MongoDB 常见NoSQL介绍——MongoDB 常见NoSQL介绍——MongoDB...

Global site tag (gtag.js) - Google Analytics