sql >> Database >  >> NoSQL >> MongoDB

tel het subdocumentveld en het totale bedrag in mongodb

De MongoDB aggregatiepijplijn is beschikbaar om uw probleem op te lossen. Je haalt details uit een array die ik verwerkt met $unwind en vervolgens $group te gebruiken om de totalen te "optellen":

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" }
    }}
])

Idealiter wil je een $match stap daarbinnen om eerst alle irrelevante gegevens eruit te filteren. Dit is eigenlijk een MongoDB-query en heeft dezelfde argumenten en operators.

De meeste hier zijn eigenlijk heel eenvoudig. De $unwind is een soort "JOIN" in SQL, behalve dat in een ingesloten structuur de "join" al is gemaakt, dus je bent gewoon aan het "de-normaliseren" zoals een join zou doen tussen "één op veel" tabelrelaties, maar alleen binnen de zelf documenteren. Het "herhaalt" in feite de "bovenliggende" documentdelen naar de array voor elk arraylid als een nieuw document.

Dan de $group werken van een sleutel, zoals in "GROUP BY", waarbij de "sleutel" de _id is waarde. Alles daar is "onderscheiden" en alle andere waarden worden verzameld door "groeperingsoperatoren".

Dit is waar bewerkingen zoals $first komen binnen. Zoals beschreven op de handleidingpagina, neemt dit de "eerste" waarde van de "groeperingsgrens" die eerder in de "sleutel" werd genoemd. U wilt dit omdat alle waarden van dit veld "waarschijnlijk" hetzelfde zijn, dus dit is een logische keuze om gewoon de "eerste" overeenkomst te kiezen.

Ten slotte is er de $sum groeperingsoperator die doet wat verwacht mag worden. Alle opgegeven waarden onder de "sleutel" worden "opgeteld" of "opgeteld" tot een totaal. Net als SQL SUM() .

Merk ook op dat alle $ namen met voorvoegsels er is hoe het aggregatieraamwerk omgaat met variabelen voor "veld-/eigenschaps"-namen binnen het huidige document dat wordt verwerkt. "Puntnotatie" wordt gebruikt om te verwijzen naar de ingesloten "velden/eigenschappen" die zijn genest in de naam van een bovenliggende eigenschap.

Het is handig om aggregatie in MongoDB te leren. Het is voor algemene vragen wat alles is dat verder gaat dan een eenvoudige "SELECT"-instructie voor SQL. Niet alleen voor "groeperen", maar ook voor andere manipulatie.

Lees de documentatie van alle aggregatie-operators en bekijk ook eens een SQL naar aggregatietoewijzing in de documentatie als een algemene gids als u al enige kennis van SQL hebt om mee te beginnen. Het helpt concepten uit te leggen en toont enkele dingen die gedaan kunnen worden.




  1. Gevoelige gegevensscheiding binnen MongoDB en NodeJS - verwijzingen via versleutelde sleutel

  2. Hoe voeg ik een automatisch oplopend veld toe aan MongoDB-aggregaat?

  3. Betere manier om MongoDB-verzameling naar een andere verzameling te verplaatsen

  4. SocketException:adres al in gebruik MONGODB