将$group结果按照特定条件排列成一组

问题描述 投票:0回答:1

在问这个问题之前,我已阅读以下关于 SO 的帖子:

但无法找出解决方案。

我有这个数据:

[
    {
        "_id": ObjectId("63ad7cea911abe16a7e75df3"),
        "number": "1726218093",
        "status_id": ObjectId("922a3bda863a4445182aeb33")
        ...
    },
    {
        "_id": ObjectId("a12f7cea911abe16a7e71e3a"),
        "number": "17182180342",
        "status_id": ObjectId("bda863a4445182aeb33922a3")
        ...
    },
    {
        "_id": ObjectId("63adb3a7cea911abe16a7e75"),
        "number": "1735218032",
        "status_id": ObjectId("63a4445182aeb3da83922a3b")
        ...
    },
    {
        "_id": ObjectId("ea911abe16a7e75df363ad7c"),
        "number": "1722218087",
        "status_id": ObjectId("182aeb3392263a4445a3bda8")
        ...
    }
    ...
]

我想按状态对数据进行分组,并根据状态的特定条件对其进行汇总。这是预期的结果:

[
    {
        "IN_AUCTION": 6546,
        "PROCESSING": 569,
        "DELIVERING": 124,
        "OTHERS": 68798
    }
]

条件:

“IN_AUCTION”包括以下状态:

["63a4445182aeb3da83922a3b", "ea911abe16a7e75df363ad7c"]

“处理中”包括以下状态:

["8e63a4445182aeb3da83922a", "5c63adea911abe16a7e75df3"]

“其他”包括所有剩余状态

首先我将它们分组:

{
  _id: "$status_id",
  count: {$count: {}}
}

之后,我又尝试了一次

$group
。但没有达到预期的结果。

然后我尝试了

$addFields

{
  "in_auction": {
    $cond: [
      {
        "$in": ["$_id", [ObjectId('63a432fc82aeb33922a3b8a0'),ObjectId('63a442c782aeb33922a3bd44')]]
      },
      0,
      {$add: "$count"}
    ]
  }
}

$addFields
似乎适用于文档本身。

我也阅读了

$ROOT
,但无法使用它。

怎样才能得到我想要的结果?如有任何帮助,我们将不胜感激。

mongodb mongodb-query aggregation-framework aggregate
1个回答
2
投票
  1. $set
    - 使用
    status field
    运算符设置
    $switch
    以相应地分配值。

  2. $group
    - 按
    status
    分组并执行计数。

  3. $group
    - 将所有文档归为一个。并在
    k
    数组中添加具有
    v
    data
    属性的文档。

  4. $replaceRoot
    - 通过将
    data
    数组转换为键值对来替换输出文档。

db.collection.aggregate([
  {
    $set: {
      status: {
        $switch: {
          branches: [
            {
              case: {
                $in: [
                  "$status_id",
                  [
                    ObjectId("63a4445182aeb3da83922a3b"),
                    ObjectId("ea911abe16a7e75df363ad7c")
                  ]
                ]
              },
              then: "IN_AUCTION"
            },
            {
              case: {
                $in: [
                  "$status_id",
                  [
                    ObjectId("8e63a4445182aeb3da83922a"),
                    ObjectId("5c63adea911abe16a7e75df3")
                  ]
                ]
              },
              then: "PROCESSING"
            }
          ],
          default: "OTHERS"
        }
      }
    }
  },
  {
    $group: {
      _id: "$status",
      count: {
        $count: {}
      }
    }
  },
  {
    $group: {
      _id: null,
      data: {
        $push: {
          k: "$_id",
          v: "$count"
        }
      }
    }
  },
  {
    $replaceRoot: {
      newRoot: {
        $arrayToObject: "$data"
      }
    }
  }
])

演示@Mongo Playground

© www.soinside.com 2019 - 2024. All rights reserved.