我一直在尝试为我的mongodb文档取得结果。我的文档如下所示:
{
"_id" : "97f98668-bdc0-441c-ab12-15c0f4313e30",
"row_id" : "927b1d4f-6357-44af-8cdb-daca7a6f89fd",
"data" : {
"info" : [
{
"name" : "dog",
"value" : [
"3"
],
"score" : 42
}
]
}
}
/* 2 */
{
"_id" : "f1994888-8c22-4d29-8523-4ff3c504665a",
"row_id" : "927b1d4f-6357-44af-8cdb-daca7a6f89fd",
"data" : {
"info" : [
{
"name" : "dog",
"value" : [
"2"
],
"score" : 70
}
]
}
}
/* 3 */
{
"_id" : "6522979b-68f3-4f62-859c-93786b23caaa",
"row_id" : "927b1d4f-6357-44af-8cdb-daca7a6f89fd",
"data" : {
"info" : [
{
"name" : "cat",
"value" : [
"2"
],
"score" : 62
}
]
}
}
我想先按row_id
将它们分组,然后再按info.name
分组。最终结构如下所示:
{
"row_id": "927b1d4f-6357-44af-8cdb-daca7a6f89fd",
"data":{
"info" : [
{
"name" : "dog",
"values" : [
{"value": "2", "score": 70},
{"value": "3", "score": 42}
]
},
{
"name" : "cat",
"values" : [
{"value": "2", "score": 62}
]
},
]
}
}
我尝试进行多个分组,但是没有按预期工作
由于您已在数组中嵌套了对象,因此必须首先对数组进行$ unwind。您可以先通过$group
和row_id
进行name
,然后通过$group
仅通过row_id
进行
db.collection.aggregate([
{
$unwind: "$data.info" // unwind array first, you cannot group on objects inside an array
},
{
$unwind: "$data.info.value" // unwind value to have only one value per record
},
{
$group: {
_id: { // group by row_id and name
row_id: "$row_id",
name: "$data.info.name"
},
values: {
$push: {
value: "$data.info.value",
score: "$data.info.score"
}
}
}
},
{
$group: {
_id: "$_id.row_id", // group again by row_id only
data_info: {
$push: {
name: "$_id.name",
values: "$values"
}
}
}
},
{
$project: { // project to desired shape
_id: false,
row_id: "$_id",
data: {
info: "$data_info"
}
}
}
])