sql >> Databasteknik >  >> NoSQL >> MongoDB

räkna deldokumentfältet och totalbeloppet i mongodb

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.




  1. Vilken NoSQL-databas för extremt stora datamängder

  2. MongoDB Indexing vs Array Implementation för vår specifika applikation

  3. Mongo:hur man sorterar efter extern vikt

  4. MongoDB:Hur man hittar ett dokument med ett id inuti ett kapslat dokument