MongoDB
 sql >> Base de données >  >> NoSQL >> MongoDB

Récupérer la liste des éléments en vérifiant plusieurs valeurs d'attribut dans MongoDB dans golang

Vous devez utiliser le cadre d'agrégation dans lequel vous exécuterez un pipeline d'agrégation qui filtre d'abord les documents de la collection en fonction de la venueList identifiants en utilisant $match opérateur.

Le deuxième pipeline impliquerait d'aplatir la venueList et sum tableaux de sous-documents afin que les données des documents soient traitées plus loin dans le pipeline en tant qu'entrées dénormalisées. Le $unwind L'opérateur est utile ici.

Un autre filtre utilisant $match est nécessaire après le déroulement afin que seuls les documents que vous souhaitez regrouper soient autorisés dans le pipeline suivant.

Le pipeline principal serait le $group étape d'opérateur qui agrège les documents filtrés pour créer les sommes souhaitées à l'aide de l'opérateur d'accumulateur $sum . Pour le résultat souhaité, vous devrez utiliser un opérateur tenary comme $cond pour créer les champs de comptage indépendants car cela fournira le nombre de documents au $sum expression en fonction de la valeur du nom.

En résumé, envisagez d'exécuter le pipeline suivant :

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

Pour une utilisation avec mGo, vous pouvez convertir le pipeline ci-dessus en suivant les instructions de http ://godoc.org/labix.org/v2/mgo#Collection.Pipe

Pour une alternative plus flexible et plus performante qui s'exécute beaucoup plus rapidement que ci-dessus, et prend également en considération les valeurs inconnues pour la liste de somme, exécutez le pipeline alternatif comme suit

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