Podstawowym przypadkiem jest tutaj użycie .aggregate()
z $unwind
ponieważ potrzebujesz dostępu do wartości w tablicy jako kluczy grupujących i oczywiście $group
ponieważ w ten sposób „grupujesz” rzeczy:
db.collection.aggregate([
{ "$match": { "auctionId": 22 } },
{ "$unwind": "$itmLst" },
{ "$group": {
"_id": "$itmLst.category",
"count": { "$sum": 1 }
}}
])
To da ci dane wyjściowe takie jak:
{ "_id": "ANTIQUES", "count": 56 }
{ "_id": "TOOLS", "count": 89 }
{ "_id": "JEWLRY", "count": 45 }
Teraz naprawdę powinieneś nauczyć się z tym żyć, ponieważ "lista" w domyślnym formacie kursora to dobra rzecz, którą można oczywiście iterować. Również nazwane klucze IMHO nie nadają się naturalnie do prezentacji danych i zazwyczaj potrzebujesz wspólnej właściwości na liście iterowalnej.
Jeśli naprawdę zamierzasz używać danych wyjściowych nazwanych kluczy w liczbie pojedynczej, będziesz potrzebować MongoDB 3.4.4 lub nowszej, aby mieć dostęp do $arrayToObject
które pozwolą ci użyć wartości jako nazw kluczy i oczywiście $replaceRoot
aby użyć tego wyrażenia jako nowego dokumentu do wytworzenia:
db.collection.aggregate([
{ "$match": { "auctionId": 22 } },
{ "$unwind": "$itmLst" },
{ "$group": {
"_id": "$itmLst.category",
"count": { "$sum": 1 }
}},
{ "$group": {
"_id": null,
"data": { "$push": { "k": "$_id", "v": "$count" } }
}},
{ "$replaceRoot": {
"newRoot": {
"$arrayToObject": "$data"
}
}}
])
Lub jeśli nie masz tej opcji, zamiast tego powinieneś konwertować wynik kursora w kodzie:
db.collection.aggregate([
{ "$match": { "auctionId": 22 } },
{ "$unwind": "$itmLst" },
{ "$group": {
"_id": "$itmLst.category",
"count": { "$sum": 1 }
}}
]).toArray().reduce((acc,curr) =>
Object.assign(acc,{ [curr._id]: curr.count }),
{}
)
Oba łączą się w jeden obiekt z nazwanymi kluczami z oryginalnego wyniku agregacji:
{
"ANTIQUES": 56,
"TOOLS": 89,
"JEWLRY": 45,
...
}
To pokazuje, że oryginalny wynik wyjściowy był naprawdę wystarczający i zazwyczaj chcesz, aby tego rodzaju „ostateczne przekształcenie” zostało wykonane w kodzie, który używa danych wyjściowych kursora, jeśli naprawdę potrzebujesz tego przekształcenia w ogóle od podstawowego potrzebne dane i tak zostały zwrócone.