Comme @Philipp l'a mentionné à juste titre dans ses commentaires
Cependant, si vous saviez à l'avance quelles sont les clés, vous pouvez utiliser les opérateurs d'agrégation $littéral
, $addToSet
et $setUnion
pour obtenir le résultat souhaité. Le pipeline d'agrégation ressemblerait à :
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" ]
}
}
}
])
Résultat :
/* 0 */
{
"result" : [
{
"_id" : ObjectId("55361320180e849972938fea"),
"attrs" : [
{
"type" : "T1",
"value" : "13",
"key" : "A1"
},
{
"type" : "T2",
"value" : "14",
"key" : "A2"
}
]
}
],
"ok" : 1
}