如何在MongoDB中按日期和特定字段进行分组

4
我希望按日期和"productId"进行分组打印。在此示例中,输出结果应如下所示:
[
  {
    "_id": "2018-03-04",
    "product1": 2,
    "product2": 2
  }
]

数据:https://mongoplayground.net/p/gzvm11EIPn2

如何制作?


你能解释一下什么是product1product2吗? - J.F.
@J.F. 谢谢 J.F. 这表明按日期分组的文档数量中,每个 productId 的数量是多少。在这个例子中,这样的结果是因为 productId 被分成了两种类型。 - newbieeyo
最后一个文档带有 courseId 但没有 productId,怎么样? - Yong Shun
@YongShun 抱歉,是我的错误。我已经编辑过了。 - newbieeyo
2个回答

2
当您在聚合中使用$group阶段时,您可以按一个字段进行分组,如下所示:{ $group: { "_id": "$field1"... 当您想按两个或更多字段进行分组时,"_id"需要成为子文档,并将字段作为键值对传递到子文档中,如下所示:
db.mycollection.aggregate([
    {
        $group:
        {
            "_id": { "product1": "$product1", "product2": "$product2", ... }
        }
    }
])

... etc.


2
  1. $group - 按照 createdAt(日期字符串)和 productId 进行分组,并通过 $sum 进行计数。

  2. $group - 按照 createdAt 进行分组,并将数据从 (1) 推送到 products 数组字段中。

  3. $replaceRoot - 用新文档替换输入文档。

    3.1. $arrayToObject - 将来自 products 数组字段的对象转换为键值对,其中 productId 是键,count 是值。

    3.2. $mergeObjects - 创建带有 _id 的对象,并将来自 (3.2) 的对象合并成一个对象。

db.collection.aggregate([
  {
    $group: {
      _id: {
        createdAt: {
          $dateToString: {
            format: "%Y-%m-%d",
            date: "$createdAt"
          }
        },
        productId: "$productId"
      },
      count: {
        $sum: 1
      }
    }
  },
  {
    $group: {
      _id: "$_id.createdAt",
      products: {
        $push: {
          productId: "$_id.productId",
          count: "$count"
        }
      }
    }
  },
  {
    "$replaceRoot": {
      "newRoot": {
        "$mergeObjects": [
          {
            _id: "$_id"
          },
          {
            $arrayToObject: {
              $map: {
                input: "$products",
                in: {
                  k: {
                    $toString: "$$this.productId"
                  },
                  v: "$$this.count"
                }
              }
            }
          }
        ]
      }
    }
  }
])

Mongo Playground示例

输出

[
  {
    "5e345223b3aa703b8a9a4f34": 2,
    "5e345223b3aa703b8a9a4f35": 2,
    "_id": "2018-03-04"
  }
]

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接