转载请出自出处: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——从入门到商业实战》书籍配套源代码。
5. 支持集合分页:Mongernate提供了分页查询的能力,帮助开发者在处理大量数据时优化性能。 6. 自动类型转换:Mongernate可以自动将Java对象的属性转换为适合存储在MongoDB中的格式,反之亦然。 7. 支持实体关系:...
总的来说,这个C# MongoDB帮助类源码提供了一种简洁的方式来处理MongoDB数据库操作,同时包含了一个有价值的性能测试,对于理解和优化MongoDB在C#环境中的分页策略非常有帮助。通过深入学习和实践,你可以更好地掌握...
MongoDB提供了强大的查询能力,支持多种查询操作符和条件。 - **使用`find`方法**:可以通过指定查询条件来过滤结果。 ```python results = collection.find({"age": {"$gt": 30}}) ``` 上述代码将返回年龄大于...
本篇文章将深入探讨如何使用Java与MongoDB进行数据分页查询,结合源码分析工具,帮助开发者更好地理解和应用这一技术。 首先,我们要了解的是MongoDB的基本概念。MongoDB是一个基于分布式文件存储的数据库,支持...
在`DocTest.java`中,可能包含了一些文档操作和查询示例,通过分析这些代码,可以进一步识别性能瓶颈,进行相应的优化。 总的来说,MongoDB的查询性能验证和优化是一个综合性的过程,涉及到索引设计、查询编写、...
总的来说,MongoDB的游标是处理查询结果的关键工具,它不仅提供了灵活的数据遍历方式,还优化了内存使用,使得大数据集的处理变得高效和可控。理解和熟练使用游标是MongoDB开发中不可或缺的部分。
MongoDB分页插件是专为MongoDB数据库设计的一个实用工具,主要目的是为了方便开发者在进行数据查询时实现高效、灵活的分页功能。在Java开发中,数据库操作是不可或缺的一部分,而面对大量数据时,分页显示尤为重要,...
MongoDB游标超时问题通常出现在使用游标迭代查询结果时,由于默认的游标超时设置(10分钟)限制,导致长时间未使用的游标失效。以下是对四种解决方法的详细阐述: 1. **修改MongoDB配置**: 这种方法涉及到更改...
在 MongoDB 中,官方建议使用游标来实现分页,而不是使用 `skip()` 方法。例如,以下是一个高效的分页实现: ``` var page1 = db.users.find().sort({ insertTime: -1 }).limit(100); var lastest = null; while ...
总的来说,MongoDB的游标机制提供了强大的查询控制能力,通过`limit`、`skip`和`sort`,用户可以灵活地处理查询结果,以适应不同的应用场景。熟练掌握这些技巧,对于优化查询性能和提高开发效率至关重要。在实际操作...
MongoDB是当前流行的NoSQL数据库之一,它支持高性能、高可用性和易扩展的特性。在处理海量数据时,MongoDB提供了很多高级管理功能来确保数据的安全性和一致性。本篇将重点介绍MongoDB的安全机制和高级管理功能,包括...
介绍了高效mongodb的php分页类,并且没有使用mongodb的skip来实现分页,需要的朋友可以参考下,mongodb分页skip limit分页要先查出所有结果再去跳过,这样如果查询页面越往后效率越低。 如果能够通过查询条件查出...
在本题中,我们将探讨 MongoDB 的查询操作,基于提供的 `user1` 和 `user2` 文档进行练习。 首先,让我们熟悉一下 `db.users.drop()` 命令。这个命令用于删除集合 `users`,如果存在的话。在 MongoDB 中,集合是...
在Java中操作MongoDB数据库时,我们经常需要执行模糊查询和分页查询来获取符合特定条件的数据,并且按需分页展示结果。本篇将详细讲解如何使用Java进行MongoDB的模糊查询和分页查询。 首先,让我们了解模糊查询。在...
如果您不习惯MongoDB查询语言,那么Studio3T的SQL查询可能会派上用场。编写SQL选择表达式和SQL联接来查询mongodb,并查看SQL查询如何转换为MQL——这是一个很好的工具。SQL查询语言
常见NoSQLj介绍——MongoDB 常见NoSQL介绍——MongoDB 常见NoSQL介绍——MongoDB 常见NoSQL介绍——MongoDB 常见NoSQL介绍——MongoDB 常见NoSQL介绍——MongoDB 常见NoSQL介绍——MongoDB 常见NoSQL介绍——MongoDB...