sql >> Databasteknik >  >> NoSQL >> MongoDB

Hämta objektlistan genom att kontrollera flera attributvärden i MongoDB i golang

Du måste använda aggregeringsramverket där du kör en aggregeringspipeline som först filtrerar dokumenten i samlingen baserat på venueList id som använder $match operatör.

Den andra pipelinen skulle innebära att venueList plattas till och summa subdocument arrays för att data i dokumenten ska kunna bearbetas längre ner i pipelinen som denormaliserade poster. $unwind operatör är användbar här.

Ytterligare ett filter med $match är nödvändigt efter avveckling så att endast de dokument som du vill sammanställa tillåts i nästa pipeline.

Huvudledningen skulle vara $grupp operatörssteg som aggregerar de filtrerade dokumenten för att skapa de önskade summorna med hjälp av ackumulatoroperatorn $summa . För det önskade resultatet skulle du behöva använda en tenary operator som $cond för att skapa de oberoende räkningsfälten eftersom det kommer att mata antalet dokument till $summa uttryck beroende på namnvärdet.

Överväg att köra följande pipeline för att sammanställa detta:

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 användning med mGo kan du konvertera ovanstående pipeline med hjälp av vägledningen i http://godoc.org/labix.org/v2/mgo#Collection.Pipe

För ett mer flexibelt och bättre presterande alternativ som körs mycket snabbare än ovanstående, och som även tar hänsyn till okända värden för summalistan, kör den alternativa pipelinen enligt följande

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. Redis Vs RabbitMQ som ett datamäklare/meddelandesystem mellan Logstash och elasticsearch

  2. Hur man väljer data med givet villkor

  3. Hur gör jag mer än/mindre än att använda MongoDB?

  4. Denormalisering med Mongoose:Hur man synkroniserar ändringar