sql >> Database >  >> NoSQL >> MongoDB

Haal de itemlijst op door meerdere attribuutwaarden te controleren in MongoDB in golang

U moet het aggregatieraamwerk gebruiken waar u een aggregatiepijplijn zou uitvoeren die eerst de documenten in de verzameling filtert op basis van de venueList id's met de $match exploitant.

De tweede pijplijn zou leiden tot het afvlakken van de venueList en sum subdocumentarrays om de gegevens in de documenten verder in de pijplijn te verwerken als gedenormaliseerde invoer. De $unwind operator is hier handig.

Nog een filter met $match is nodig na het afwikkelen, zodat alleen de documenten die u wilt samenvoegen in de volgende pijplijn worden toegelaten.

De belangrijkste pijplijn is de $group operatorfase die de gefilterde documenten samenvoegt om de gewenste sommen te creëren met behulp van de accumulatoroperator $sum . Voor het gewenste resultaat moet u een tenary-operator gebruiken zoals $cond om de onafhankelijke telvelden te maken, aangezien dat het aantal documenten zal voeden met de $sum expressie afhankelijk van de naamwaarde.

Als u dit alles bij elkaar optelt, kunt u overwegen de volgende pijplijn te gebruiken:

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

Voor gebruik met mGo kunt u de bovenstaande pijplijn converteren met behulp van de richtlijnen in http://godoc.org/labix.org/v2/mgo#Collection.Pipe

Voor een flexibeler en beter presterend alternatief dat veel sneller wordt uitgevoerd dan het bovenstaande en ook rekening houdt met onbekende waarden voor de somlijst, voert u de alternatieve pijplijn als volgt uit

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. MongoError:verbind ECONNREFUSED 127.0.0.1:27017

  2. Bull-wachtrij:wanneer een taak mislukt, hoe kunt u voorkomen dat de wachtrij de resterende taken verwerkt?

  3. Hoe dit asynchrone probleem met MongoDB/Node te omzeilen?

  4. Een verzameling lezen die afhankelijk is van een andere in Meteor