sql >> Database >  >> NoSQL >> MongoDB

Vind duplicaat in array zonder $unwind

U kunt $range gebruiken om reeksen getallen te genereren van 1 naar n waar n is de $size van adds . Dan kun je door die nummers "doorlopen" en controleren of adds bij index ($arrayElemAt ) bestaat ergens vóór index zo ja, dan moet het als een duplicaat worden beschouwd. U kunt $indexOfArray gebruiken om te controleren of een element bestaat in de array met vermelding van 0 en index als zoekbereik.

Dan hoef je alleen maar $project . te gebruiken en $map om indexen te vervangen door daadwerkelijke elementen. U kunt ook $setUnion toevoegen om dubbele duplicaten in de uiteindelijke resultatenset te voorkomen.

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

Afdrukken:

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


  1. Hoe te controleren of een arrayveld deel uitmaakt van een andere array in MongoDB?

  2. MongoDB Aggregation-opdracht naar Java-code

  3. Een veld met typenummer verlagen in mongodb en nodejs

  4. Realtime chatten met Modulus en Node.js