MongoDB
 sql >> Baza danych >  >> NoSQL >> MongoDB

Znajdź duplikat wewnątrz tablicy bez $unwind

Możesz użyć $range do generowania tablic liczb z 1 do n gdzie n to $size adds . Następnie możesz „zapętlić” te liczby i sprawdzić, czy adds w index ($arrayElemAt ) istnieje gdzieś przed index jeśli tak, należy go uznać za duplikat. Możesz użyć $indexOfArray aby sprawdzić, czy element istnieje w tablicy podając 0 i index jako zakres wyszukiwania.

Następnie wystarczy użyć $project i $map zastąpić indeksy rzeczywistymi elementami. Możesz też dodać $setUnion aby uniknąć duplikatów w końcowym zestawie wyników.

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

Wydruki:

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


  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. Wyrażenia regularne Spring data mongodb repositories

  2. Czy istnieje równoważne narzędzie, takie jak profiler sql dla mongodb?

  3. Połączenie z MongoDB nie powiodło się podczas korzystania z platformy .NET Core działającej w systemie Linux

  4. Rekurencyjne zapytanie Mongodb

  5. Jak napisać zapytanie Mongo, aby znaleźć poddokument z warunkiem