我希望按日期和"productId"进行分组打印。在此示例中,输出结果应如下所示:
[
{
"_id": "2018-03-04",
"product1": 2,
"product2": 2
}
]
数据:https://mongoplayground.net/p/gzvm11EIPn2
如何制作?
[
{
"_id": "2018-03-04",
"product1": 2,
"product2": 2
}
]
数据:https://mongoplayground.net/p/gzvm11EIPn2
如何制作?
$group
阶段时,您可以按一个字段进行分组,如下所示:{ $group: { "_id": "$field1"...
当您想按两个或更多字段进行分组时,"_id"
需要成为子文档,并将字段作为键值对传递到子文档中,如下所示:db.mycollection.aggregate([
{
$group:
{
"_id": { "product1": "$product1", "product2": "$product2", ... }
}
}
])
... etc.
$group
- 按照 createdAt
(日期字符串)和 productId
进行分组,并通过 $sum
进行计数。
$group
- 按照 createdAt
进行分组,并将数据从 (1) 推送到 products
数组字段中。
$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"
}
}
}
}
]
}
}
}
])
输出
[
{
"5e345223b3aa703b8a9a4f34": 2,
"5e345223b3aa703b8a9a4f35": 2,
"_id": "2018-03-04"
}
]
product1
和product2
吗? - J.F.courseId
但没有productId
,怎么样? - Yong Shun