使用MongoDB快速分页
admin
2023-02-06 14:00:04
0

使用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

相关内容

热门资讯

智算服务市场规模突破1300亿... 在近期举办的2025算力互联网大会上,国家算力互联网服务平台跨域体系发布,标志着我国算力发展迈入协同...
呼和浩特市人工智能产业应用场景... 央广网呼和浩特1月15日消息(记者李春雪)1月15日,内蒙古自治区呼和浩特市人工智能产业应用场景供需...
印航一客机先因伊朗领空关闭而返... 【环球网报道 记者 李飒】据《印度时报》《印度斯坦时报》等印媒报道,一架载有超250人的印度航空公司...
网络素养应成为生活必修课 信息时代,我们已能便捷触达世界,却常在真假难辨的迷雾中迷失方向。当网络成为生活必需品,从青少年到老年...
表演艺术家陶玉玲逝世,享年92... 根据央视新闻,著名电影表演艺术家陶玉玲于今天(1月15日)下午在北京去世,享年92岁。1月15日晚间...
重点场景招商项目清单 重点场景招商项目清单 01 针织机械产业集群数字化转型项目 相关信息: 报送单位:市发改委 产业领域...
美国扣押一艘与委内瑞拉有关的油... 当地时间15日,据两名美国官员透露,在美国总统特朗普与委内瑞拉反对派代表马查多会晤前夕,美国扣押了一...
网红县长贺娇龙离世,“我想抱抱... 在2025年终总结视频的结尾,贺娇龙对自己说:“老己,别给自己设限。我不祝你永远高光,因为那太沉重。...
佳讯飞鸿:坚持双轮驱动,多场景... 来源:问董秘 投资者提问: 董秘你好:公司目前有Ai应用吗?谢谢 董秘回答(佳讯飞鸿SZ300213...
原创 谁... 在阅读文章前,辛苦您点下“关注”,方便讨论和分享。作者定会不负众望,按时按量创作出更优质的内容 文...