如何在分组依据中使用多个项目
How to use multiple items in group by
我有这样的数据:
[
{"createdAt": 2022-02-10T00:00:00.000Z,name:'stack',value:'3'}
{"createdAt": 2022-02-10T00:00:00.000Z,name:'google',value:'30'}
{"createdAt": 2022-03-10T00:00:00.000Z,name:'stack',value:'33'}
{"createdAt": 2022-04-10T00:00:00.000Z,name:'google',value:'32'}
{"createdAt": 2022-03-10T00:00:00.000Z,name:'google',value:'31'}
{"createdAt": 2022-02-10T00:00:00.000Z,name:'stack',value:'13'}
{"createdAt": 2022-04-10T00:00:00.000Z,name:'stack',value:'23'}
{"createdAt": 2022-02-10T00:00:00.000Z,name:'google',value:'33'}
{"createdAt": 2022-04-10T00:00:00.000Z,name:'google',value:'43'}
{"createdAt": 2022-03-10T00:00:00.000Z,name:'stack',value:'32'}
{"createdAt": 2022-02-10T00:00:00.000Z,name:'stack',value:'35'}
{"createdAt": 2022-04-10T00:00:00.000Z,name:'google',value:'38'}
]
查询
db.collection.aggregate([
{$group:{_id:{$dayOfYear:"$createdAt",name:"$name"},"total":{$sum:"$value"}}}
])
预期结果:
[
{name:google,date:2022-02-10:,value:63}
{name:google,date:2022-03-10:,value:31}
{name:google,date:2022-04-10:,value:113}
{name:google,date:2022-02-10:,value:51}
{name:google,date:2022-03-10:,value:65}
{name:google,date:2022-04-10:,value:23}
]
我尝试按多个项目分组并收到以下错误:
An object representing an expression must have exactly one field: { $dayOfYear: "$createdAt", name: "$name" }
$set
- 使用 date-only 字符串创建 date
字段(通过 $dateToString
)。
$group
- 按 date
和 name
分组。要将 value
求和为 total
,您需要先通过 $int
转换为整数。
$project
- 修饰输出文档。
db.collection.aggregate([
{
$set: {
date: {
"$dateToString": {
"date": "$createdAt",
"format": "%Y-%m-%d"
}
}
}
},
{
$group: {
_id: {
date: "$date",
name: "$name"
},
"total": {
$sum: {
$toInt: "$value"
}
}
}
},
{
$project: {
_id: 0,
date: "$_id.date",
name: "$_id.name",
total: "$total"
}
}
])
我有这样的数据:
[
{"createdAt": 2022-02-10T00:00:00.000Z,name:'stack',value:'3'}
{"createdAt": 2022-02-10T00:00:00.000Z,name:'google',value:'30'}
{"createdAt": 2022-03-10T00:00:00.000Z,name:'stack',value:'33'}
{"createdAt": 2022-04-10T00:00:00.000Z,name:'google',value:'32'}
{"createdAt": 2022-03-10T00:00:00.000Z,name:'google',value:'31'}
{"createdAt": 2022-02-10T00:00:00.000Z,name:'stack',value:'13'}
{"createdAt": 2022-04-10T00:00:00.000Z,name:'stack',value:'23'}
{"createdAt": 2022-02-10T00:00:00.000Z,name:'google',value:'33'}
{"createdAt": 2022-04-10T00:00:00.000Z,name:'google',value:'43'}
{"createdAt": 2022-03-10T00:00:00.000Z,name:'stack',value:'32'}
{"createdAt": 2022-02-10T00:00:00.000Z,name:'stack',value:'35'}
{"createdAt": 2022-04-10T00:00:00.000Z,name:'google',value:'38'}
]
查询
db.collection.aggregate([
{$group:{_id:{$dayOfYear:"$createdAt",name:"$name"},"total":{$sum:"$value"}}}
])
预期结果:
[
{name:google,date:2022-02-10:,value:63}
{name:google,date:2022-03-10:,value:31}
{name:google,date:2022-04-10:,value:113}
{name:google,date:2022-02-10:,value:51}
{name:google,date:2022-03-10:,value:65}
{name:google,date:2022-04-10:,value:23}
]
我尝试按多个项目分组并收到以下错误:
An object representing an expression must have exactly one field: { $dayOfYear: "$createdAt", name: "$name" }
$set
- 使用 date-only 字符串创建date
字段(通过$dateToString
)。$group
- 按date
和name
分组。要将value
求和为total
,您需要先通过$int
转换为整数。$project
- 修饰输出文档。
db.collection.aggregate([
{
$set: {
date: {
"$dateToString": {
"date": "$createdAt",
"format": "%Y-%m-%d"
}
}
}
},
{
$group: {
_id: {
date: "$date",
name: "$name"
},
"total": {
$sum: {
$toInt: "$value"
}
}
}
},
{
$project: {
_id: 0,
date: "$_id.date",
name: "$_id.name",
total: "$total"
}
}
])