MongoDB конвейер за агрегиране
е на разположение, за да реши вашия проблем. Получавате подробности от обработвания от мен масив с $unwind
и след това с помощта на $group
за да "сумирате" сумите:
db.collection.aggregate([
// Unwind the array to de-normalize as documents
{ "$unwind": "$details" },
// Group on the key you want and provide other values
{ "$group": {
"_id": "$details.itemcode",
"itemname": { "$first": "$details.itemname" },
"totalprice": { "$sum": "$details.price" },
"totalqty": { "$sum": "$details.qty" }
}}
])
В идеалния случай искате $match
влезте там, за да филтрирате първо всички неподходящи данни. Това е основно MongoDB заявка и приема всички същите аргументи и оператори.
Повечето тук наистина са прости. $unwind
е нещо като "JOIN" в SQL, с изключение на това, че във вградена структура "join" вече е направено, така че вие просто "денормализирате", както би направило съединението между релации на таблица "едно към много", но само в рамките на самия документ. Той основно „повтаря“ частите на „родителския“ документ в масива за всеки член на масива като нов документ.
След това $group
работи на ключ, като в "GROUP BY", където "ключът" е _id
стойност. Всичко там е „различно“ и всички други стойности се събират от „оператори за групиране“.
Това е мястото, където операции като $first
влезте. Както е описано на страницата с ръководство, това взема "първата" стойност от "границата на групиране", спомената в "ключа" по-рано. Искате това, защото всички стойности на това поле е „вероятно“ да бъдат еднакви, така че това е логичен избор просто да изберете „първото“ съвпадение.
Накрая има $sum
групиращ оператор, който прави това, което трябва да се очаква. Всички предоставени стойности под „ключа“ се „добавят“ или „сумират“, за да се получи обща сума. Точно като SQL SUM()
.
Също така имайте предвид, че всички $
префиксирани имена там е как рамката за агрегиране се занимава с променливи за имена на "поле/свойство" в рамките на текущия документ, който се обработва. "Нотация с точки"
се използва за препратка към вградените „полета/свойства“, вложени в името на родителско свойство.
Полезно е да научите агрегирането в MongoDB. За общите заявки е това, което всичко отвъд елементарния израз "SELECT" е за SQL. Не само за „групиране“, но и за други манипулации.
Прочетете документацията на всички оператори за агрегиране и също така разгледайте съпоставяне на SQL към агрегиране в документацията като общо ръководство, ако сте запознати с SQL като начало. Помага да се обяснят концепциите и показва някои неща, които могат да бъдат направени.