Mongo 分页查询-02

Mongo 分页查询-02

MongoDB是一个基于文档的数据存储,因此分页是最常见的用例之一。 那么你什么时候对响应进行分页? 答案非常简洁; 只要您想以块的形式处理结果,就可以进行分页。 一些常见的情况是

  • 批量处理
  • 在用户界面上显示大量结果

客户端和服务器端的分页都非常昂贵,不应该考虑。 因此,分页通常在数据库级别处理,并且数据库也针对此类需求进行了优化。

下面我将向您解释两种方法,通过它们可以轻松地对MongoDB响应进行分页.样本例子:
[code]
{
"_id" : ObjectId("5936d17263623919cd5165bd"),
"name" : "Lisa Rogers",
"marks" : 34
}
[/code]

方法1

使用cursor.skip和cursor.limit
MongoDB游标有两种方法可以简化分页; 他们是
cursor.skip()
cursor.limit()
skip(n)将从光标跳过n个文档,而limit(n)将限制从光标返回的文档数。 因此,两个自然分页的组合响应。

在Mongo Shell中,您的分页代码看起来像这样.

[code]
// Page 1
db.students.find().limit(5)

// Page 2
db.students.find().skip(5).limit(5)

// Page 3
db.students.find().skip(5).limit(5)
[/code]

python 脚本
[python]
def skiplimit(page_size, page_num):
"""returns a set of documents belonging to page number `page_num`
where size of each page is `page_size`.
"""
# Calculate number of documents to skip
skips = page_size * (page_num – 1)

# Skip and limit
cursor = db[‘students’].find().skip(skips).limit(page_size)

# Return documents
return [x for x in cursor]
[/python]

方法2

使用_id和限制
这种方法将有效地利用_id的默认索引和ObjectId的本质。
[code]
// Page 1
db.students.find().limit(10)

// Page 2
last_id = … # logic to get last_id
db.students.find({‘_id’: {‘$gt’: last_id}}).limit(10)

// Page 3
last_id = … # logic to get last_id
db.students.find({‘_id’: {‘$gt’: last_id}}).limit(10)
[/code]
python 脚本
[python]
def idlimit(page_size, last_id=None):
"""Function returns `page_size` number of documents after last_id
and the new last_id.
"""
if last_id is None:
# When it is first page
cursor = db[‘students’].find().limit(page_size)
else:
cursor = db[‘students’].find({‘_id’: {‘$gt’: last_id}}).limit(page_size)

# Get the data
data = [x for x in cursor]

if not data:
# No documents left
return None, None

# Since documents are naturally ordered with _id, last document will
# have max id.
last_id = data[-1][‘_id’]

# Return data and last_id
return data, last_id

[/python]
注意:

如果您使用_id以外的字段进行排序,请确保该字段已加入索引并正确排序,否则性能将受到影响。

参考链接
MongoDB 分页查询的方法及性能
Mongo skip说明

发表评论

您的电子邮箱地址不会被公开。