使用MongoDB快速分页 英文原文:Http://blog.monGodirector.com/fast-paging-with-mongoDB/ 通过你的数据分页是使用MongoDB
使用MongoDB快速分页
英文原文:
Http://blog.monGodirector.com/fast-paging-with-mongoDB/
通过你的数据分页是使用MongoDB最常用操作之一。典型的案例是需要在你的UI的表格中显示结果。如果你正在批处理数据,分页策略正确是很重要的,以致你的数据处理可扩展。
让我们通过一个示例来看看在MongoDB中通过数据分页的不同方法。在这个示例中,我们有一个用户数据库CRM,我们需要分页并一次显示10个用户。因此我们的分页大小是10.这是我们的用户文档结构:
{
_id,
name,
company,
state
}
方法1:使用skip()和limit()
MongoDB本地支持使用skip()和limit()命令的分页操作。skip(n)命令告诉MongoDB跳过n条结果,limit(n)命令告诉MongoDB限制结果长度为“n”个结果。典型地你会通过游标使用skip()和limit()命令 – 但是为了描述这个案例我们提供了控制台命令来完成相同的结果。因为代码的简洁性,也排除了检查代码的限制。
//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页的代码像这样:
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”的下一页的文档
//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后缀到你的查询去决定。
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
--结束END--
本文标题: 使用MongoDB快速分页
本文链接: https://lsjlt.com/news/37251.html(转载时请注明来源链接)
有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341
2024-10-23
2024-10-22
2024-10-22
2024-10-22
2024-10-22
2024-10-22
2024-10-22
2024-10-22
2024-10-22
2024-10-22
回答
回答
回答
回答
回答
回答
回答
回答
回答
回答
0