Não há uma maneira na estrutura de agregação do mongodb para tratar uma chave dentro de um documento como dados que você pode examinar ou manipular. Uma solução alternativa é transformar o que você está usando como chaves aqui (por exemplo, tipo de fruta e nome da loja) em valores como este:
{
"_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
}
]
}
]
}
Isso permite que você trabalhe com esses dados mais facilmente na agregação:
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}}])
A saída se parece com:
{
"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
}