MongoDB agregační kanál
je k dispozici pro vyřešení vašeho problému. Podrobnosti získáte z pole mého zpracování pomocí $unwind
a poté pomocí $group
pro "součet" součtů:
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" }
}}
])
V ideálním případě chcete $match
nejprve tam odfiltrujte všechna irelevantní data. Toto je v podstatě dotaz MongoDB a bere všechny stejné argumenty a operátory.
Většina zde je opravdu jednoduchá. $unwind
je něco jako "JOIN" v SQL s tím rozdílem, že ve vložené struktuře je "spojení" již vytvořeno, takže pouze "denormalizujete", jako by spojení udělalo mezi vztahy "jeden k mnoha", ale pouze v rámci samotný dokument. V podstatě "zopakuje" části "nadřazeného" dokumentu do pole pro každý člen pole jako nový dokument.
Poté $group
funguje jako klíč, jako v "GROUP BY", kde "klíč" je _id
hodnota. Všechno tam je "rozlišující" a všechny ostatní hodnoty shromažďují "operátoři seskupení".
Zde jsou operace jako $first
vstupte. Jak je popsáno na stránce manuálu, přebírá „první“ hodnotu z „hranice seskupení“ zmíněné v „klíči“ dříve. Chcete to, protože všechny hodnoty tohoto pole jsou "pravděpodobně" stejné, takže je to logická volba, jak vybrat "první" shodu.
Nakonec je tu $sum
operátor seskupení, který dělá to, co se očekává. Všechny dodané hodnoty pod "klíčem" se "sčítají" nebo "sčítají" dohromady a poskytují celkový součet. Stejně jako SQL SUM()
.
Všimněte si také, že všechny $
předponou existuje způsob, jakým agregační rámec pracuje s proměnnými pro názvy "polí/vlastností" v rámci aktuálního zpracovávaného dokumentu. "Dot notation"
se používá k odkazování na vložená "pole/vlastnosti" vnořené do názvu nadřazené vlastnosti.
Je užitečné naučit se agregaci v MongoDB. Pro obecné dotazy je to, co je pro SQL cokoliv nad rámec základního příkazu "SELECT". Nejen pro "seskupování", ale také pro další manipulaci.
Přečtěte si dokumentaci všech operátorů agregace a také se podívejte na mapování SQL na agregaci v dokumentaci jako obecné vodítko, pokud máte pro začátek nějaké znalosti SQL. Pomáhá vysvětlit pojmy a ukazuje některé věci, které lze udělat.