MongoDBs aggregationspipeline
finns tillgänglig för att lösa ditt problem. Du får information ur en array min bearbetning med $unwind
och sedan använda $group
för att "summa" summan:
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" }
}}
])
Helst vill du ha en $match
steg där för att filtrera bort all irrelevant data först. Detta är i grunden MongoDB-fråga och tar alla samma argument och operatorer.
Det mesta här är egentligen enkelt. $unwind
är ungefär som en "JOIN" i SQL förutom att i en inbäddad struktur är "join" redan gjord, så du "avnormaliserar" bara som en join skulle göra mellan "en till många" tabellrelationer men bara inom dokumentet självt. Det "upprepar" i princip de "överordnade" dokumentdelarna till arrayen för varje arraymedlem som ett nytt dokument.
Sedan $group
fungerar av en nyckel, som i "GROUP BY", där "nyckeln" är _id
värde. Allt där är "distinkt" och alla andra värderingar samlas in av "grupperingsoperatörer".
Det är här operationer som $first
Kom in. Som beskrivs på manualsidan tar detta det "första" värdet från "grupperingsgränsen" som nämndes i "nyckeln" tidigare. Du vill ha detta eftersom alla värden i det här fältet "sannolikt" är desamma, så det här är ett logiskt val att bara välja den "första" matchningen.
Slutligen finns det $sum
grupperingsoperatör som gör vad som kan förväntas. Alla angivna värden under "nyckeln" "läggs till" eller "summeras" tillsammans för att ge en total. Precis som SQL SUM()
.
Observera också att alla $
prefixade namn där är hur aggregeringsramverket hanterar variabler för "fält-/egenskapsnamn" i det aktuella dokumentet som bearbetas. "Pricknotation"
används för att referera till de inbäddade "fälten/egenskaperna" som är kapslade i ett överordnat egenskapsnamn.
Det är användbart att lära sig aggregering i MongoDB. Det är för allmänna frågor vad allt utöver en grundläggande "SELECT"-sats är för SQL. Inte bara för "gruppering" utan för annan manipulation också.
Läs igenom dokumentationen för alla aggregationsoperatörer och ta även en titt på SQL till aggregationsmappning i dokumentationen som en allmän vägledning om du har en viss förtrogenhet med SQL till att börja med. Det hjälper till att förklara begrepp och visar några saker som kan göras.