MongoDB 游标与分页

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_18948359/article/details/88637529

说明:本篇文章主要介绍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() 函数,效率高一些。

猜你喜欢

转载自blog.csdn.net/qq_18948359/article/details/88637529