sql >> Databasteknik >  >> NoSQL >> MongoDB

Hitta duplikat inuti array utan $unwind

Du kan använda $range för att generera arrayer av nummer från 1 till n där n är $size av adds . Sedan kan du "slinga" genom dessa siffror och kontrollera om adds vid index ($arrayElemAt ) finns någonstans före index om ja ska det betraktas som en duplikat. Du kan använda $indexOfArray för att kontrollera om element finns i array som anger 0 och index som sökintervall.

Sedan behöver du bara använda $project och $map för att ersätta index med faktiska element. Du kan också lägga till $setUnion för att undvika duplicerade dubbletter i slutresultatuppsättningen.

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

Utskrifter:

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


  1. Hur får man aktuell anslutningspoolbeläggning på klient med mongo .net-drivrutin?

  2. Är MongoDB ett giltigt alternativ till relationell db + lucene?

  3. Heroku Custom Domain fungerar inte

  4. Använd lean i mongoose med callback