Mongodb通过id重新分页-这是一种反模式吗?

Mongodb通过id重新分页-这是一种反模式吗?,mongodb,pagination,Mongodb,Pagination,这类问题以前有人问过,我也问过,但我仍然无法集中精力 所以,Mongo按id按自然顺序存储文档(据我所知,这是写入磁盘的物理顺序吗?),并且每个文档(几乎)都有一个比上一个更大的id。伟大的因此,假设我们在一个集合中有11个文档,每个整数按自然排序顺序表示每个id,如[1][2][3][4][5][6][7][8][9][10][11]。假设文档是数组 假设我们想在没有其他查询参数的情况下分页所有这些文档,每5页 因此,我们执行并获得: db.foo.find().limit(5)-[1][2]

这类问题以前有人问过,我也问过,但我仍然无法集中精力

所以,Mongo按id按自然顺序存储文档(据我所知,这是写入磁盘的物理顺序吗?),并且每个文档(几乎)都有一个比上一个更大的id。伟大的因此,假设我们在一个集合中有11个文档,每个整数按自然排序顺序表示每个id,如
[1][2][3][4][5][6][7][8][9][10][11]
。假设文档是数组

假设我们想在没有其他查询参数的情况下分页所有这些文档,每5页

因此,我们执行并获得:

db.foo.find().limit(5)
-
[1][2][3][4][5]

db.foo.find({''u id':{'$gt':[5]}).限制(5)
-
[6][7][8][9][10]

db.foo.find({''u id':{'$gt':[10]})。限制(5)
-
[11]

到目前为止还不错

这次文档
[4]
添加了大量内容,超出了预先分配的大小限制,因此现在我们的物理/自然(?)排序顺序是
[1][2][3][5][6][7][8][9][10][11][4]

因此,我们执行并获得:

db.foo.find().limit(5)
-
[1][2][3][5][6]

db.foo.find({''u id':{'$gt':[6]})。限制(5)
-
[7][8][9][10][11]

db.foo.find({''u id':{'$gt':[11]})。限制(5)
-无


所以在本例中,我们跳过
[4]
?在这种情况下,如果删除一个文档并在其位置添加一个新文档(通常会变成
[12]
),也会发生类似的情况。如果我的理解是正确的-没有明确指定顺序的分页是一种反模式吗?另一方面,如果您指定了排序,这是否意味着您仍然必须访问集合中的每个文档,然后对它们进行排序?

如果您按索引排序,则它不必访问所有文档

在MongoDB中,排序操作可以通过检索 基于索引中的排序的文档。如果查询计划器 无法从索引中获取排序顺序,它将对结果进行排序 在记忆中。使用索引的排序操作通常具有更好的性能 性能优于那些不使用索引的。此外,排序 不使用索引的操作将在使用32时中止 兆字节的内存


欢迎!一个有效的答案需要的不仅仅是一个链接,而链接将变得不可用。请阅读