Vous pouvez utiliser $range
pour générer des tableaux de nombres à partir de 1
à n
où n
est la $size
de adds
. Ensuite, vous pouvez "faire une boucle" à travers ces numéros et vérifier si adds
à index
($arrayElemAt
) existe quelque part avant index
si oui, il doit être considéré comme un doublon. Vous pouvez utiliser $indexOfArray
pour vérifier si l'élément existe dans le tableau en spécifiant 0 et index
comme plage de recherche.
Ensuite, il vous suffit d'utiliser $project
et $map
pour remplacer les index par des éléments réels. Vous pouvez également ajouter $setUnion
pour éviter les doublons en double dans le jeu de résultats final.
db.users.aggregate([
{
$addFields: {
duplicates: {
$filter: {
input: { $range: [ 1, { $size: "$adds" } ] },
as: "index",
cond: {
$ne: [ { $indexOfArray: [ "$adds", { $arrayElemAt: [ "$adds", "$$index" ] }, 0, "$$index" ] }, -1 ]
}
}
}
}
},
{
$project: {
_id: 1,
adds: {
$setUnion: [ { $map: { input: "$duplicates", as: "d", in: { $arrayElemAt: [ "$adds", "$$d" ] } } }, [] ]
}
}
}
])
Impressions :
{ "_id" : 1, "adds" : [ "111" ] }
{ "_id" : 2, "adds" : [ "555" ] }
{ "_id" : 3, "adds" : [ "888" ] }