sql >> Databáze >  >> NoSQL >> MongoDB

Najít duplikát uvnitř pole bez $unwind

Můžete použít $range generovat pole čísel z 1 na n kde n je $size z adds . Poté můžete tato čísla "procházet" a zkontrolovat, zda adds na index ($arrayElemAt ) existuje někde před index pokud ano, mělo by být považováno za duplikát. Můžete použít $indexOfArray zkontrolovat, zda prvek existuje v poli specifikující 0 a index jako rozsah vyhledávání.

Pak stačí použít $project a $map k nahrazení indexů skutečnými prvky. Můžete také přidat $setUnion abyste se vyhnuli duplicitním duplikátům v sadě konečných výsledků.

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

Tiskne:

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


  1. Tipy pro spuštění MongoDB v produkci pomocí změnových streamů

  2. Zkopírujte první hodnotu pole do jiného pole v MongoDB

  3. Jak mohu implementovat oprávnění na úrovni pole pro MongoDB?

  4. Podporuje MongoDB typy s plovoucí desetinnou čárkou?