Вы можете использовать агрегационный конвейер с $group
и $push
Агрегационный трубопровод
db.t41.aggregate([
{$group : {
_id : "$field1",
field4 : {$push : {field2 : "$field2", field3 : "$field3"}}
}},
{$project : {_id : 0, field1 : "$_id", field4 : "$field4"}}
]).pretty()
коллекция
> db.t41.find()
{ "_id" : ObjectId("5c34260a4ffb628e45e69c00"), "field1" : "e8b0f2b5-de4a-4449-b2aa-15f009ac4978", "field2" : "9911", "field3" : "a" }
{ "_id" : ObjectId("5c34260a4ffb628e45e69c01"), "field1" : "e8b0f2b5-de4a-4449-b2aa-15f009ac4978", "field2" : "1100", "field3" : "b" }
{ "_id" : ObjectId("5c34260a4ffb628e45e69c02"), "field1" : "e8b0f2b5-de4a-4449-b2aa-15f009ac4978", "field2" : "0099", "field3" : "c" }
>
результат
> db.t41.aggregate([{$group : {_id : "$field1", field4 : {$push : {field2 : "$field2", field3 : "$field3"}}}}, {$project : {_id : 0, field1 : "$_id", field4 : "$field4"}}]).pretty()
{
"field1" : "e8b0f2b5-de4a-4449-b2aa-15f009ac4978",
"field4" : [
{
"field2" : "9911",
"field3" : "a"
},
{
"field2" : "1100",
"field3" : "b"
},
{
"field2" : "0099",
"field3" : "c"
}
]
}
>
EDIT-1
это работает без жесткого кодирования клавиш
db.t41.aggregate([
{$group : { _id : "$field1", data : {$push : {$objectToArray : "$$ROOT"}}}},
{$addFields : {data : {$map : {input : "$data", as : "d", in : {$arrayToObject : {$slice : ["$$d", 2, {$size : "$$d"}]}}}}}}
]).pretty()
конвейер агрегации
> db.t41.aggregate([{$group : { _id : "$field1", data : {$push : {$objectToArray : "$$ROOT"}}}}, {$addFields : {data : {$map : {input : "$data", as : "d", in : {$arrayToObject : {$slice : ["$$d", 2, {$size : "$$d"}]}}}}}}]).pretty()
{
"_id" : "e8b0f2b5-de4a-4449-b2aa-15f009ac4978",
"data" : [
{
"field2" : "9911",
"field3" : "a"
},
{
"field2" : "1100",
"field3" : "b"
},
{
"field2" : "0099",
"field3" : "c"
}
]
}
>