Jak słusznie wspomniał @Philipp w swoich komentarzach
Jeśli jednak wiedziałeś wcześniej, jakie są klucze, możesz użyć operatorów agregacji $literal
, $addToSet
i $setUnion
aby uzyskać pożądany rezultat. Potok agregacji będzie wyglądał następująco:
db.collection.aggregate([
{
"$project": {
"attrs.A1.key": { "$literal": "A1" },
"attrs.A1.type": "$attrs.A1.type",
"attrs.A1.value": "$attrs.A1.value",
"attrs.A2.key": { "$literal": "A2" },
"attrs.A2.type": "$attrs.A2.type",
"attrs.A2.value": "$attrs.A2.value"
}
},
{
"$group": {
"_id": "$_id",
"A1": { "$addToSet": "$attrs.A1" },
"A2": { "$addToSet": "$attrs.A2" }
}
},
{
"$project": {
"attrs": {
"$setUnion": [ "$A1", "$A2" ]
}
}
}
])
Wynik :
/* 0 */
{
"result" : [
{
"_id" : ObjectId("55361320180e849972938fea"),
"attrs" : [
{
"type" : "T1",
"value" : "13",
"key" : "A1"
},
{
"type" : "T2",
"value" : "14",
"key" : "A2"
}
]
}
],
"ok" : 1
}