【问题标题】:MongoDB aggregate sorting different response on same valuesMongoDB聚合对相同值的不同响应进行排序
【发布时间】:2021-02-12 23:09:33
【问题描述】:

当我使用 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
      }
}

解决了。

是什么原因?还有其他解决方案?

【问题讨论】:

  • 默认情况下,mongo 会按找到的顺序输出值,因此没有“默认排序”或其他方式,只能按所需值排序。

标签: database mongodb sorting aggregate


【解决方案1】:

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

【讨论】:

  • id 45 聚合后不插入。它在聚合之前插入。我同意你的一些回答。但是当我在排序中添加_id时没有问题。就像所说的不同的限制值返回不同的排序。
  • 在 v.4.4 中进行了一些测试,除非在 $sort 之前的聚合中有其他一些阶段并且不保留自然文档顺序,否则我没有看到这种行为的随机性,什么是你用的mongod版本?
  • mongo 版本 4.2.3 你可以创建示例 1k 虚拟数据,计数 1-10 之间的数字,然后重试。
猜你喜欢
  • 1970-01-01
  • 2015-12-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-24
  • 2016-02-10
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多