首页 > 解决方案 > MongoDB聚合对相同值的不同响应进行排序

问题描述

当我使用 mongodb 聚合进行分页时,我发现了一个问题。我会详细介绍一下。此问题仅在排序时发生。我做了一个模式来保持简单。模型有一个随机生成的计数(数字)用于排序,并具有 id(数字),以便我们可以直观地进行操作并且它是唯一的。

聚合管道如

db.getCollection('test').aggregate([{
        $sort:{
              count:-1
           }
        },
        {
            $skip : 0
        },
        {
            $limit :2
        }])

示例限制 2 返回的数据

/* 1 */
{
    "_id" : ObjectId("6027005ffba493078dca3580"),
    "count" : 9,
    "id" : 38
}

/* 2 */
{
    "_id" : ObjectId("6027005ffba493078dca3565"),
    "count" : 9,
    "id" : 11
}

当限制示例 3 返回数据

/* 1 */
{
    "_id" : ObjectId("6027005ffba493078dca3587"),
    "count" : 9,
    "id" : 45
}

/* 2 */
{
    "_id" : ObjectId("6027005ffba493078dca3580"),
    "count" : 9,
    "id" : 38
}

/* 3 */
{
    "_id" : ObjectId("6027005ffba493078dca3565"),
    "count" : 9,
    "id" : 11
}

对于限制 2 第一个元素 id = 38,对于限制 3 第一个元素 id = 45

对于不同的限制跳过值,对于相同的值排序,它总是返回不同的响应。这个问题使我无法正确分页。

如果我添加第二个排序示例

$sort:{
         count:-1
         _id: 1
      }
}

它已解决。

是什么原因?和另一个解决方案?

标签: databasemongodbsortingaggregate

解决方案


这是在执行 limit:2 聚合示例后立即插入具有 id:45 的文档时的预期行为,limit:3 示例将在顶部显示具有 id:45 的文档,因为已加载文档/索引以进行排序基于文档 _id 的自然插入顺序,并且 _id 单调递增已经排序。基于上述情况,我认为如果您在排序阶段也添加 _id 没有任何区别,因为如果未指定文档将根据 _id 自动排序,并且所有文档的计数值都相同......


推荐阅读