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
.
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
.
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