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

Rufen Sie die Artikelliste ab, indem Sie mehrere Attributwerte in MongoDB in Golang überprüfen

Sie müssten das Aggregationsframework verwenden, in dem Sie eine Aggregationspipeline ausführen würden, die zuerst die Dokumente in der Sammlung basierend auf der venueList filtert ids mit dem $match Operator.

Die zweite Pipeline würde das Abflachen der venueList beinhalten und sum Unterdokumentarrays, damit die Daten in den Dokumenten weiter unten in der Pipeline als denormalisierte Einträge verarbeitet werden können. Der $unwind Operator ist hier nützlich.

Ein weiterer Filter mit $match ist nach dem Entladen erforderlich, damit nur die Dokumente, die Sie aggregieren möchten, in die nächste Pipeline zugelassen werden.

Die Hauptpipeline wäre der $group -Operatorstufe, die die gefilterten Dokumente aggregiert, um mithilfe des Akkumulatoroperators $sum . Für das gewünschte Ergebnis müssten Sie einen Zehneroperator wie $cond um die unabhängigen Zählfelder zu erstellen, da dies die Anzahl der Dokumente in $sum Ausdruck abhängig vom Namenswert.

Alles in allem sollten Sie die folgende Pipeline ausführen:

db.collection.aggregate([
    { "$match": { "venueList.id": { "$in": ["VID1212", "VID4343"] } } },
    { "$unwind": "$venueList" },
    { "$match": { "venueList.id": { "$in": ["VID1212", "VID4343"] } } },
    { "$unwind": "$venueList.sum" },    
    {
        "$group": {
            "_id": null,
            "linux": {
                "$sum": {
                    "$cond": [ 
                        { "$eq": [ "$venueList.sum.name", "linux" ] }, 
                        "$venueList.sum.value", 0 
                    ]
                }
            },
            "ubuntu": {
                "$sum": {
                    "$cond": [ 
                        { "$eq": [ "$venueList.sum.name", "ubuntu" ] }, 
                        "$venueList.sum.value", 0 
                    ]
                }
            }
        }
    }
])

Für die Verwendung mit mGo können Sie die obige Pipeline mithilfe der Anleitung in http umwandeln://godoc.org/labix.org/v2/mgo#Collection.Pipe

Für eine flexiblere und leistungsstärkere Alternative, die viel schneller als oben ausgeführt wird und auch unbekannte Werte für die Summenliste berücksichtigt, führen Sie die alternative Pipeline wie folgt aus

db.collection.aggregate([
    { "$match": { "venueList.id": { "$in": ["VID1212", "VID4343"] } } },
    { "$unwind": "$venueList" },
    { "$match": { "venueList.id": { "$in": ["VID1212", "VID4343"] } } },
    { "$unwind": "$venueList.sum" },    
    { 
        "$group": {
            "_id": "$venueList.sum.name",
            "count": { "$sum": "$venueList.sum.value" }
        }
    },
    { 
        "$group": {
            "_id": null,
            "counts": {
                "$push": {
                    "name": "$_id",
                    "count": "$count"
                }
            }
        }
    }
])