首页 > 解决方案 > MongoDB $push 聚合不会保持正确的顺序

问题描述

我尝试使用 MongoDB 进行 $group 聚合,如下例所示:

"$group": {
            "_id": "$test_id",
            "feeling": {
                "$push": "$feeling"
            },
            "reference_id": {
                "$push": "$_id"
            },
            "training_start": {
                "$push": "$training_start"
            },
            "training_duration": {
                "$push": "$duration_ms"
            }
        }

聚合工作正常,但创建的数组排序不同。这意味着,如果我通过查看reference_id[x]training_start[x]检查聚合结果,则源集合中training_start的值不等于training_start[x]

也许一个例子更准确地说明了我的问题:

$group聚合后的一个文档:

{
  _id: "string_1",
  reference_id: [1, 2, 3],
  training_start: [01:00:00, 02:00:00, 03:00:00] (date times)
}

来自源集合的文档:

{
  _id:1,
  training_start: 01:00:00,
  test_id: "string_1"
},
{
  _id:2,
  training_start: 03:00:00,
  test_id: "string_1"
},
{
  _id:3,
  training_start: 02:00:00,
  test_id: "string_1"
}

这些数组中的第一个元素总是按正确的顺序排列。因此,我使用下面的代码检查了每个分组字段是否具有相同数量的条目。恼人的结果是,每个数组中的条目数量是相等的。因此,缺失值不会导致数组发生偏移。

"$group": {
            "_id": "$test_id",
            "sum": {
                "$sum": {
                    "$cond": {
                        "if": {
                          "$lte": [
                              "$training_start", null
                            ]
                        },
                        "then": 0,
                        "else": 1
                    }
                }
            }

有谁知道,如果有另一种方法来创建保持顺序的数组(已经尝试过$addToSet),推入的元素?还是我有问题?

问候马克斯

标签: mongodbmongodb-queryaggregation-framework

解决方案


推荐阅读