MongoDB
 sql >> Datenbank >  >> NoSQL >> MongoDB

Zählen Sie das Filialdokumentfeld und den Gesamtbetrag in Mongodb

Die MongoDB Aggregationspipeline ist verfügbar, um Ihr Problem zu lösen. Sie erhalten Details aus einem Array meiner Verarbeitung mit $unwind und dann mit $group um die Summen zu "summieren":

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

Idealerweise möchten Sie einen $match Schritt dort hinein, um zuerst alle irrelevanten Daten herauszufiltern. Dies ist im Grunde eine MongoDB-Abfrage und verwendet dieselben Argumente und Operatoren.

Das meiste hier ist wirklich einfach. Der $unwind ist eine Art "JOIN" in SQL, außer dass in einer eingebetteten Struktur der "Join" bereits erstellt wurde, sodass Sie nur "denormalisieren", wie es ein Join zwischen "Eins-zu-Vielen"-Tabellenbeziehungen tun würde, aber nur innerhalb der selbst dokumentieren. Es "wiederholt" im Grunde die "übergeordneten" Dokumentteile des Arrays für jedes Arraymitglied als neues Dokument.

Dann $group arbeitet mit einem Schlüssel, wie in "GROUP BY", wobei der "Schlüssel" die _id ist Wert. Alles dort ist "eindeutig" und alle anderen Werte werden von "Gruppierungsoperatoren" gesammelt.

Hier werden Operationen wie $first come in. Wie auf der Handbuchseite beschrieben, nimmt dies den "ersten" Wert aus der "Gruppierungsgrenze", die zuvor im "Schlüssel" erwähnt wurde. Sie möchten dies, weil alle Werte dieses Felds "wahrscheinlich" gleich sind, also ist es eine logische Wahl, einfach die "erste" Übereinstimmung auszuwählen.

Schließlich gibt es noch den $sum Gruppierungsoperator, der das tut, was erwartet werden sollte. Alle gelieferten Werte unter dem "Schlüssel" werden zu einer Summe "addiert" oder "summiert". Genau wie SQL SUM() .

Beachten Sie auch, dass alle $ Namen mit Präfix gibt an, wie das Aggregations-Framework mit Variablen für "Feld-/Eigenschafts"-Namen innerhalb des aktuell verarbeiteten Dokuments umgeht. "Punktnotation" wird verwendet, um auf die eingebetteten "Felder/Eigenschaften" zu verweisen, die in einem übergeordneten Eigenschaftsnamen verschachtelt sind.

Es ist nützlich, die Aggregation in MongoDB zu lernen. Es ist für allgemeine Abfragen, was etwas anderes als eine einfache "SELECT"-Anweisung für SQL ist. Nicht nur zum "Gruppieren", sondern auch für andere Manipulationen.

Lesen Sie die Dokumentation aller Aggregationsoperatoren durch und werfen Sie auch einen Blick auf SQL to Aggregation Mapping in der Dokumentation als allgemeine Anleitung, wenn Sie bereits mit SQL vertraut sind. Es hilft bei der Erklärung von Konzepten und zeigt einige Dinge, die getan werden können.