sql >> Database teknologi >  >> NoSQL >> MongoDB

Find duplikat inde i array uden $unwind

Du kan bruge $range at generere arrays af tal fra 1 til n hvor n er $size af adds . Så kan du "sløjfe" gennem disse tal og kontrollere, om adds ved index ($arrayElemAt ) eksisterer et sted før index hvis ja, skal det betragtes som et duplikat. Du kan bruge $indexOfArray for at kontrollere, om element findes i array, der angiver 0 og index som søgeområde.

Så skal du bare bruge $project og $map at erstatte indekser med faktiske elementer. Du kan også tilføje $setUnion for at undgå duplikerede dubletter i det endelige resultatsæt.

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

Udskrifter:

{ "_id" : 1, "adds" : [ "111" ] }
{ "_id" : 2, "adds" : [ "555" ] }
{ "_id" : 3, "adds" : [ "888" ] }


  1. Hvordan omdøber man et felt i et array med databasekommandoer?

  2. 3 måder at returnere distinkte værdier i MongoDB

  3. pullAll mens du fjerner indlejrede objekter

  4. MongoDB vælg count (distinct x) på en indekseret kolonne - tæl unikke resultater for store datasæt