英文原文:
http://blog.mongodirector.com/fast-paging-with-mongodb/
通过你的数据分页是使用MongoDB最常用操作之一。典型的案例是需要在你的UI的表格中显示结果。如果你正在批处理数据,分页策略正确是很重要的,以致你的数据处理可扩展。
让我们通过一个示例来看看在MongoDB中通过数据分页的不同方法。在这个示例中,我们有一个用户数据库CRM,我们需要分页并一次显示10个用户。因此我们的分页大小是10.这是我们的用户文档结构:
1
2
3
4
5
6
|
{
_id,
name,
company,
state
}
|
方法1:使用skip()和limit()
MongoDB本地支持使用skip()和limit()命令的分页操作。skip(n)命令告诉MongoDB跳过n条结果,limit(n)命令告诉MongoDB限制结果长度为“n”个结果。典型地你会通过游标使用skip()和limit()命令 – 但是为了描述这个案例我们提供了控制台命令来完成相同的结果。因为代码的简洁性,也排除了检查代码的限制。
1
2
3
4
5
6
7
|
//Page
1
db.
users
.
find
().limit (10)
//Page
2
db.
users
.
find
().skip(10).limit(10)
//Page
3
db.
users
.
find
().skip(20).limit(10)
........
|
你明白了。通常获取第n页的代码像这样:
1
|
db.
users
.
find
().skip(pagesize*(n-1)).limit(pagesize)
|
然而随着数据大小的增长,该方法有严重的性能问题。原因是每次查询执行时,完整的结果集被构建,然后实例必须从集合的开始定位到特定的偏移位置。因为你的偏移增加,这个过程变得越来越慢。这个过程也不能有效利用索引。因此典型地“skip()”和“limit()”方法对于小的数据集时是有效的。如果你使用大数据集,你需要考虑其他方法。
方法2:使用find()和limit()
之前的方法扩展得不是很好的原因是skip()命令。因此这部分的目标是不使用“skip()”命令执行分页。我们使用时间戳或文档中的id以自然顺序存储数据。在这个示例中,我们使用存储在每个文档中的“_id”。“_id”是一个MongoDB的ObjectID结构,是一个12字节的结构,包含时间戳、机器、进程ID、计数器等。整体想法如下:
1. 获取当前页最后文档的_id
2. 获取大于该“_id”的下一页的文档
1
2
3
4
5
6
7
8
|
//Page
1
db.
users
.
find
().limit(pageSize);
//Find
the
id
of the last document
in
this page
last_id = ...
//Page
2
users
= db.
users
.
find
({
'_id'
> last_id}). limit(10);
//Update
the last
id
with the
id
of the last document
in
this page
last_id = ...
|
该方法保持了存在于“_id”列中的固有顺序。也因为“_id”列默认被索引,查找性能非常好。如果你正使用的列没有被索引,你的性能将会变差 -- 因此确保该列有索引是很重要的。
如果你也想为你的分页以特定顺序排列数据,你可以用以上技术使用sort()从句。确保排序过程覆盖索引获得最佳性能非常重要。你可以使用.explain后缀到你的查询去决定。
1
2
3
|
users
= db.
users
.
find
({
'_id'
> last_id}).
sort
(..).limit(10);
//Update
the last
id
with the
id
of the last document
in
this page
last_id = ...
|
一如既往如果你有任何问题或者评论请随时联系我们support@mongodirector.com
本文转自UltraSQL51CTO博客,原文链接:http://blog.51cto.com/ultrasql/1740517 ,如需转载请自行联系原作者