sql >> Database teknologi >  >> NoSQL >> MongoDB

tæl deldokumentfeltet og samlet beløb i mongodb

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.




  1. Sporing af MongoDB-hukommelsesbrug

  2. Multi-Tenant Rails 3 App på Heroku ved hjælp af PostgreSQL

  3. vælg distinkt mongodb C#

  4. MongoDb findes pr. kolonne