Il n'existe aucun moyen dans le cadre d'agrégation mongodb de traiter une clé à l'intérieur d'un document comme des données que vous pouvez examiner ou manipuler. Une solution de contournement consiste à transformer ce que vous utilisez comme clés ici (par exemple, le type de fruit et le nom du magasin) en valeurs comme celle-ci :
{
"_id" : "doc1",
"stores":[
{
// store name is a value
"name":"store_A",
"inventory": [
{
// so is fruit type
"type" : "apple",
"count" : 50
},
{
"type" : "orange",
"count" : 20
}
]
},
{
"name": "store_B",
"inventory": [
{
"type" : "orange",
"count" : 15
}
]
}
]
}
Cela vous permet de travailler plus facilement avec ces données en agrégation :
db.coll.aggregate([
// split documents by store name
{$unwind:"$stores"},
// split documents further by fruit type
{$unwind:"$stores.inventory"},
// group documents together by store/fruit type, count quantities of fruit
{$group:{"_id":{"store":"$stores.name", "fruit":"$stores.inventory.type"},
"count":{$sum:"$stores.inventory.count"}}},
// reformat the data to look more like your specification
{$project:{
"store":"$_id.store",
"fruit":"$_id.fruit",
"_id":0,
"count":1}}])
La sortie ressemble à :
{
"result" : [
{
"count" : 15,
"store" : "store_B",
"fruit" : "apple"
},
{
"count" : 15,
"store" : "store_B",
"fruit" : "orange"
},
{
"count" : 30,
"store" : "store_A",
"fruit" : "orange"
},
{
"count" : 50,
"store" : "store_A",
"fruit" : "apple"
}
],
"ok" : 1
}