首页 > 解决方案 > 如何在给定条件下聚合一天中的匹配记录,其中日期和计数值存储在数组中

问题描述

我正在尝试查询 mongo 集合以获取匹配条件“状态”的结果:每个日期的新结果并将结果推送到数组。

    I have tried the below query, but it is not grouping by date as expected. Please help.

试过这个:

  db.collection.aggregate([
      {
        $match: {
          status: "New"
        }
      },
      {
        $sort: {
          date: 1
        }
      },
      {
        $group: {
          _id: {
            status: "$status"
          },
          series: {
            $push: {
              name: "$Date",
              value: {
                $sum: 1
              }
            }
          }
        }
      },
      {
        $addFields: {
          name: "$_id.status"
        }
      }
    ])

样品采集和预期结果:

    **Sample Collection:**
    [
      {
        "_id": "abcd123",
        "Date": "2018-06-08T09:42:36.000Z",
          "status": "New",
    },
    {
        "_id": "abcd124",
        "Date": "2018-06-09T09:42:36.000Z",
          "status": "New"
    },
    {
        "_id": "abcd125",
        "Date": "2018-06-09T09:31:44.000Z",
          "status": "New"
    },
    {
        "_id": "abcd126",
        "Date": "2018-06-10T09:42:43Z",
          "status": "New"
    },
    ]
    **Expected Result:**

[ {“_id”:{“状态”:“新”},“名称”:“新”,“系列”:[ {“名称”:“2018-06-08T09:42:52Z”,“价值”: 1},{“名称”:“2018-06-09T09:42:58Z”,“价值”:2},{“名称”:“2018-06-10T09:42:43Z”,“价值”:1} , ] } ]

标签: mongodb

解决方案


@matthPen 早些时候回答了这个问题。此处:如何在给定条件下聚合每个不同记录的总和并在 mongodb 中的数组中获取结果

我只需要在他的答案中添加“addFields”。我在这里问之前没有检查他的答案是我的错误。

db.collection.aggregate([
  {
    $match: {
      status: "New"
    }
  },
  {
    $group: {
      _id: "$Date",
      value: {
        $sum: 1
      }
    }
  },
  {
    $group: {
      _id: null,
      series: {
        $push: {
          name: "$_id",
          value: "$value"
        }
      }
    }
  },
  {
    $addFields: {
      name: "New"
    }
  },

])

可能会帮助寻找类似查询的人


推荐阅读