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

Trouver un doublon à l'intérieur du tableau sans $unwind

Vous pouvez utiliser $range pour générer des tableaux de nombres à partir de 1 à nn 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" ] }