说明:本篇文章主要介绍MongoDB 中游标(cursor)的使用,以及使用 skip() 与 limit() 函数实现分页,最后讲解 sort() 函数进行排序。
MongoDB 游标(cursor)
所谓游标就是指的是数据可以一行行的进行操作,非常类似于 ResultSet(java中的数据对象) 数据处理。在 MongoDB 中对于游标的处理也比较简单,只需要使用 find() 函数就可以返回游标。
声明游标
// 获取游标
var cursor = db.collection.find({});
// 判断是否还有下一行数据
cursor.hasNext();
// 获取当前文档数据
cursor.next()
示例:使用循环来操作
var obj;
var cursor = db.collection.find();
while( cursor.hasNext() ){
obj = cursor.next();
// todo
...
}
示例:使用 javaScript 中的 forEach 迭代数据
var obj;
var cursor = db.collection.find();
cursor.forEach(function(item){
// todo
...
})
游标的生命周期
游标会消耗一定的内存和资源,下面几种情况会释放游标占用的资源
- 游标遍历完成以后
- 客户端发送终止消息
- 游标超过 10 分钟没有被使用
MongoDB 分页
MongoDB 分页需要使用到的两个函数 limit() 与 skip() ,如果我们需要排序,就可以使用 sort() 函数
limit: 限制游标返回的数量,指定了上限
skip: 忽略前面的部分文档,如果文档总数量小于忽略的数量,则返回空集合
sort: 得到的子集合进行排序,可以按照多个键进行正反排序!
limit() 与 skip() 的使用
示例:只查询前面 50 条数据
db.collection.find().limit(50);
示例:跳过前面 50条数据
db.collection.find().skip(50);
sort() 函数的使用
要进行排序使用 sort,对应的 key 值为 1 升序,-1 为降序
示例:使按照 价格 price 从高到低 排序。
db.collection.find().sort({price: 1});
示例:使用 price 和 name 两个字段都是升序排序
db.collection.find().sort({price: 1, name: 1});
分页实现
第一种方法:数据量比较少的时候可以使用这种。
// 查询第一页的数据
db.test.find().sort({"price":1}).limit(20);
// 查询第二页的数据
db.test.find().sort({"price":1}).limit(20).skip(20);
// 后面的数据就依次类推
db.test.find().sort({"price":1}).limit(20).skip(40);
...
第二方式:因为 skip() 函数比较消耗资源,所以下面的方式避开使用 skip () 操作。
// 取到第一页数据
var page1 = db.test.find().sort({"price":1}).limit(20);
var latest ;
// 判读是否有下一页数据
while( page1.hasNext() ){
latest = page1.next();
}
// 查询下一页的数据
db.test.find({"price": {"$gt": latest.price} }).sort({"price":1}).limit(20);
对于这种操作就需要记录当前记录的那个值,然后每次取大于这值后面一页的数据,此时是避免使用 skip() 函数,效率高一些。