web-dev-qa-db-fra.com

Mongo trouve des doublons pour les entrées de deux ou plusieurs champs

J'ai des documents comme celui-ci:

{
    "_id" : ObjectId("557eaf444ba222d545c3dffc"),
    "foreing" : ObjectId("538726124ba2222c0c0248ae"),
    "value" : "test",
}

Je veux trouver tous les documents qui ont des valeurs dupliquées pour la paire foreing & value.

21
Haris Hajdarevic

Vous pouvez facilement identifier les doublons en exécutant l'opération de pipeline d'agrégation suivante:

db.collection.aggregate([
    { 
        "$group": { 
            "_id": { "foreing": "$foreing", "value": "$value" }, 
            "uniqueIds": { "$addToSet": "$_id" },
            "count": { "$sum": 1 } 
        }
    }, 
    { "$match": { "count": { "$gt": 1 } } }
])

Le $group dans la première étape est utilisé pour regrouper les documents par les valeurs de clé foreign et value, puis créer un tableau de _id valeurs pour chacun des documents groupés comme le champ uniqueIds en utilisant le $addToSet opérateur. Cela vous donne un tableau de valeurs d'expression uniques pour chaque groupe. Obtenez le nombre total de documents groupés à utiliser dans les étapes de pipeline ultérieures avec le $sum opérateur.

Dans la deuxième étape du pipeline, utilisez le $match opérateur pour filtrer tous les documents avec un nombre de 1. Les documents filtrés représentent des clés d'index uniques.

Les documents restants seront ceux de la collection qui ont des valeurs de clé en double pour la paire foreing & value.

29
chridam

Il suffit de regrouper sur la base de 2 clés, et de sélectionner les éléments avec un décompte supérieur à 1, pour trouver les doublons.

Requête : - Sera comme

db.mycollection.aggregate(
    { $group: { 
        _id: { foreing: "$foreing", value: "$value" },
        count: { $sum:  1 },
        docs: { $Push: "$_id" }
    }},
    { $match: {
        count: { $gt : 1 }
    }}
)

[~ # ~] sortie [~ # ~] : - Sera comme

{
    "result" : [
        {
            "_id" : {
                "foreing" : 1,
                "value" : 2
            },
            "count" : 2,
            "docs" : [
                ObjectId("34567887654345678987"),
                ObjectId("34567887654345678987")
            ]
        }
    ],
    "ok" : 1
}

Lien de référence: - Comment trouver des documents mongo avec un même champ

16
Nishant