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

Hent vareliste ved at kontrollere flere attributværdier i MongoDB i golang

Du skal bruge aggregeringsrammen, hvor du vil køre en aggregeringspipeline, der først filtrerer dokumenterne i samlingen baseret på venueList id'er ved hjælp af $match operatør.

Den anden pipeline ville indebære en fladning af venueList og sum underdokumentarrays for at dataene i dokumenterne kan behandles længere nede i pipelinen som denormaliserede posteringer. $unwind operatør er nyttig her.

Et yderligere filter ved hjælp af $match er nødvendig efter afvikling, så kun de dokumenter, du ønsker at samle, er tilladt i den næste pipeline.

Hovedpipelinen ville være $gruppe operatørtrin, som samler de filtrerede dokumenter for at skabe de ønskede summer ved hjælp af akkumulatoroperatoren $sum . For at opnå det ønskede resultat skal du bruge en tenary operator som $cond at oprette de uafhængige optællingsfelter, da det vil føre antallet af dokumenter til $sum udtryk afhængigt af navneværdien.

Overvej at køre følgende pipeline:

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

Til brug med mGo kan du konvertere ovenstående pipeline ved hjælp af vejledningen i http://godoc.org/labix.org/v2/mgo#Collection.Pipe

For et mere fleksibelt og bedre ydende alternativ, som udføres meget hurtigere end ovenstående, og som også tager hensyn til ukendte værdier for sumlisten, skal du køre den alternative pipeline som følger

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



  1. Hvordan sletter man en gammel version af mongodb og installerer den nye i cloud9 IDE?

  2. Hvordan udfører jeg mongodump-kommandoen programmatisk fra node.js?

  3. Enkel forbindelse til mongodb i react app

  4. Spring boot caching med redis, nøgle har \xac\xed\x00\x05t\x00\x06