MongoDB aggregeringspipeline
er tilgængelig for at løse dit problem. Du får detaljer ud af et array min behandling med $unwind
og derefter bruge $group
at "summe" totalerne:
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" }
}}
])
Ideelt set ønsker du en $match
trin der for at filtrere alle irrelevante data fra først. Dette er dybest set MongoDB-forespørgsel og tager alle de samme argumenter og operatorer.
Det meste her er virkelig simpelt. $unwind
er en slags "JOIN" i SQL, bortset fra at i en indlejret struktur er "join" allerede lavet, så du "de-normaliserer", som en join ville gøre mellem "en til mange" tabelrelationer, men kun inden for selv dokumentere. Det "gentager" dybest set de "overordnede" dokumentdele til arrayet for hvert arraymedlem som et nyt dokument.
Derefter $group
virker af en nøgle, som i "GROUP BY", hvor "key" er _id
værdi. Alt der er "distinkt", og alle andre værdier er samlet af "grupperingsoperatører".
Det er her operationer som $first
kommer ind. Som beskrevet på manualsiden tager dette den "første" værdi fra "grupperingsgrænsen" nævnt i "nøglen" tidligere. Du ønsker dette, fordi alle værdier i dette felt "sandsynligvis" er de samme, så dette er et logisk valg blot at vælge det "første" match.
Endelig er der $sum
grupperingsoperatør, som gør, hvad der skal forventes. Alle angivne værdier under "nøgle" er "adderet" eller "summeret" sammen for at give en total. Ligesom SQL SUM()
.
Bemærk også, at alle $
præfiksede navne er der, hvordan aggregeringsrammen håndterer variabler for "felt-/egenskabs"-navne i det aktuelle dokument, der behandles. "Priknotation"
bruges til at referere til de indlejrede "felter/egenskaber" indlejret i et overordnet egenskabsnavn.
Det er nyttigt at lære aggregering i MongoDB. Det er til generelle forespørgsler, hvad alt ud over en grundlæggende "SELECT"-sætning er for SQL. Ikke kun til "gruppering", men også til anden manipulation.
Læs dokumentationen for alle aggregeringsoperatører og tag også et kig på en SQL til Aggregation Mapping i dokumentationen som en generel vejledning, hvis du har et vist kendskab til SQL til at begynde med. Det hjælper med at forklare begreber og viser nogle ting, der kan gøres.