MongoDB 使用 $sort、$skip 和 $limit 返回错误的行

Sor*_*Bgm 2 mongoose mongodb

这是我正在使用的功能

MyModel.aggregate([
  { $match: query },
  { $sort: { 'createdAt': -1 } },
  { $skip: skip },
  { $limit: 10 }
  ], { allowDiskUse : true });
Run Code Online (Sandbox Code Playgroud)

query是过滤行。skip是基于分页的动态值(即0、10、20...)。问题是,每页的行都是错误的。例如,我可以同时看到第1,2,3,4页中的特定行!有些行也丢失了。

为什么会发生这种情况?

use*_*973 7

我认为这个问题的关键是您在此评论中分享的信息:

createdAt对于许多行具有相同的值。有没有可能$sort无法正常工作?

这并不是说排序不一定“正常工作”,而是它没有足够的信息来每次进行确定性排序。的值本身123并不出现在另一个值之前或之后。123正如@Noel 指出的,您需要为您的排序提供一个附加字段。

文档中也对此进行了介绍:

MongoDB 不按特定顺序将文档存储在集合中。对包含重复值的字段进行排序时,包含这些值的文档可能会以任何顺序返回。

如果需要一致的排序顺序,请在排序中至少包含一个包含唯一值的字段。保证这一点的最简单方法是_id在排序查询中包含该字段。

这是因为_id领域是独一无二的。如果您采取这种方法,它会将您的排序更改为:

{ $sort: { 'createdAt': -1, _id: 1 } },
Run Code Online (Sandbox Code Playgroud)