MongoDB
 sql >> база данни >  >> NoSQL >> MongoDB

MongoDB $setUnion

В MongoDB, $setUnion Операторът на конвейера за агрегиране приема два или повече масива и връща масив, съдържащ елементите, които се появяват във всеки от тези входни масиви.

$setUnion приема два или повече аргумента, всички от които могат да бъдат всеки валиден израз, стига всеки от тях да се разрешава в масив. $setUnion третира масивите като набори.

Пример

Да предположим, че имаме колекция, наречена data със следните документи:

{ "_id" :1, "a" :[ 1, 2, 3 ], "b" :[ 1, 2, 3 ] }{ "_id" :2, "a" :[ 1, 2, 3 ], "b" :[ 1, 2 ] }{ "_id" :3, "a" :[ 1, 2 ], "b" :[ 1, 2, 3 ] }{ "_id" :4, " a" :[ 1, 2, 3 ], "b" :[ 3, 4, 5 ] }{ "_id" :5, "a" :[ 1, 2, 3 ], "b" :[ 4, 5 , 6 ] }

Можем да приложим $setUnion оператор срещу a и b полета в тези документи.

Пример:

db.data.aggregate(
   [
     { $match: { _id: { $in: [ 1, 2, 3, 4, 5 ] } } },
     {
       $project:
          {
            _id: 0,
            a: 1,
            b: 1,
            result: { $setUnion: [ "$a", "$b" ] }
          }
     }
   ]
) 

Резултат:

{ "a" :[ 1, 2, 3 ], "b" :[ 1, 2, 3 ], "резултат" :[ 1, 2, 3 ] }{ "a" :[ 1, 2, 3 ], "b" :[ 1, 2 ], "резултат" :[ 1, 2, 3 ] }{ "a" :[ 1, 2 ], "b" :[ 1, 2, 3 ], "резултат " :[ 1, 2, 3 ] }{ "a" :[ 1, 2, 3 ], "b" :[ 3, 4, 5 ], "резултат" :[ 1, 2, 3, 4, 5 ] }{ "a" :[ 1, 2, 3 ], "b" :[ 4, 5, 6 ], "резултат" :[ 1, 2, 3, 4, 5, 6 ] }

Вложени масиви

$setUnion операторът не се спуска в никакви вложени масиви. Той оценява само масиви от най-високо ниво.

Да предположим, че нашата колекция съдържа и следните документи:

{ "_id" :6, "a" :[ 1, 2, 3 ], "b" :[ [ 1, 2, 3 ] ] }{ "_id" :7, "a" :[ 1, 2, 3 ], "b" :[ [ 1, 2 ], 3 ] }{ "_id" :8, "a" :[ [ 1, 2, 3 ] ], "b" :[ [ 1, 2, 3 ] ] }{ "_id" :9, "a" :[ [ 1, 2, 3 ] ], "b" :[ [ 1, 2 ], 3 ] }

И ние прилагаме $setUnion към тези два документа:

db.data.aggregate(
   [
     { $match: { _id: { $in: [ 6, 7, 8, 9 ] } } },
     {
       $project:
          {
            _id: 0,
            a: 1,
            b: 1,
            result: { $setUnion: [ "$a", "$b" ] }
          }
     }
   ]
) 

Резултат:

{ "a" :[ 1, 2, 3 ], "b" :[ [ 1, 2, 3 ] ], "резултат" :[ 1, 2, 3, [ 1, 2, 3 ] ] } { "a" :[ 1, 2, 3 ], "b" :[ [ 1, 2 ], 3 ], "резултат" :[ 1, 2, 3, [ 1, 2 ] ] }{ "a" :[ [ 1, 2, 3 ] ], "b" :[ [ 1, 2, 3 ] ], "резултат" :[ [ 1, 2, 3 ] ] }{ "a" :[ [ 1, 2, 3 ] ], "b" :[ [ 1, 2 ], 3 ], "резултат" :[ 3, [ 1, 2 ], [ 1, 2, 3 ] ] }

Липсващи полета

Прилага се $setUnion към несъществуващо поле води до null .

Разгледайте следните документи:

{ "_id" :10, "a" :[ 1, 2, 3 ] }{ "_id" :11, "b" :[ 1, 2, 3 ] }{ "_id" :12 } 

Първият документ няма b поле, вторият документ няма a поле, а третият документ няма нито едно от двете.

Ето какво се случва, когато приложим $setUnion към a и b полета:

db.data.aggregate(
   [
     { $match: { _id: { $in: [ 10, 11, 12 ] } } },
     {
       $project:
          {
            _id: 0,
            a: 1,
            b: 1,
            result: { $setUnion: [ "$a", "$b" ] }
          }
     }
   ]
) 

Резултат:

{ "a" :[ 1, 2, 3 ], "резултат" :null }{ "b" :[ 1, 2, 3 ], "резултат" :null }{ "резултат" :нулев } 

Грешен тип данни

Всички операнди на $setUnion трябва да са масиви. Ако не са, се извежда грешка.

Да предположим, че нашата колекция съдържа следните документи:

{ "_id" :13, "a" :[ 1, 2, 3 ], "b" :3 }{ "_id" :14, "a" :3, "b" :[ 1, 2, 3 ] }{ "_id" :15, "a" :2, "b" :3 }

И ние прилагаме $setUnion към тези документи:

db.data.aggregate(
   [
     { $match: { _id: { $in: [ 13, 14, 15 ] } } },
     {
       $project:
          {
            _id: 0,
            a: 1,
            b: 1,
            result: { $setUnion: [ "$a", "$b" ] }
          }
     }
   ]
) 

Резултат:

Грешка:командата е неуспешна:{ "ok" :0, "errmsg" :"Всички операнди на $setUnion трябва да са масиви. Един аргумент е от тип:double", "code" :17043, "codeName" :"Location17043 "} :неуспешен агрегат :[email protected]/mongo/shell/utils.js:25:[email protected]/mongo/shell/assert.js:18:[email protected]/mongo/shell/assert. js:639:[email protected]/mongo/shell/assert.js:729:[email protected]/mongo/shell/db.js:266:[email protected]/mongo/shell/collection.js:1058:12@(обвивка):1:1

Дублиращи се стойности

$setUnion оператор филтрира дубликати в резултата си, за да изведе масив, който съдържа само уникални записи. Освен това редът на елементите в изходния масив не е посочен.

Да предположим, че имаме следните документи:

{ "_id" :16, "a" :[ 1, 1, 2, 2, 3, 3 ], "b" :[ 1, 2, 3 ] }{ "_id" :17, "a" :[ 1, 1, 2, 2, 3, 3 ], "b" :[ 1, 1, 2 ] }{ "_id" :18, "a" :[ 1, 1, 2, 2, 3, 3 ], "b" :[ ] }{ "_id" :19, "a" :[ 3, 2, 1, 2, 3, 1 ], "b" :[ 2, 3, 1 ] }{ "_id" :20, "a" :[ 1, 3, 2, 2, 3, 1 ], "b" :[ 2, 1 ] }{ "_id" :21, "a" :[ 2, 3, 1, 2 , 3, 1 ], "b" :[ ] }

След това прилагаме $setUnion оператор към тях:

db.data.aggregate(
   [
     { $match: { _id: { $in: [ 16, 17, 18, 19, 20, 21 ] } } },
     {
       $project:
          {
            _id: 0,
            a: 1,
            b: 1,
            result: { $setUnion: [ "$a", "$b" ] }
          }
     }
   ]
) 

Резултат:

{ "a" :[ 1, 1, 2, 2, 3, 3 ], "b" :[ 1, 2, 3 ], "резултат" :[ 1, 2, 3 ] }{ "a" :[ 1, 1, 2, 2, 3, 3 ], "b" :[ 1, 1, 2 ], "резултат" :[ 1, 2, 3 ] }{ "a" :[ 1, 1, 2 , 2, 3, 3 ], "b" :[ ], "резултат" :[ 1, 2, 3 ] }{ "a" :[ 3, 2, 1, 2, 3, 1 ], "b" :[ 2, 3, 1 ], "резултат" :[ 1, 2, 3 ] }{ "a" :[ 1, 3, 2, 2, 3, 1 ], "b" :[ 2, 1 ], " резултат" :[ 1, 2, 3 ] }{ "a" :[ 2, 3, 1, 2, 3, 1 ], "b" :[ ], "резултат" :[ 1, 2, 3 ] } 

Повече от два аргумента

Както споменахме, $setUnion приема два или повече аргумента. Всички предишни примери са използвали два аргумента. Ето един, който използва три аргумента.

Да предположим, че имаме следните документи:

{ "_id" :22, "a" :[ 1, 2 ], "b" :[ 1, 2 ], "c" :[ 1, 2 ] }{ "_id" :23, "a" :[ 1, 2 ], "b" :[ 1, 2 ], "c" :[ 1, 2, 3 ] }{ "_id" :24, "a" :[ 1, 2 ], "b" :[ 1, 2 ], "c" :[ 4, 5 ] }

Тези документи имат допълнително поле – c поле.

Сега нека приложим $setUnion към тези три полета:

db.data.aggregate(
   [
     { $match: { _id: { $in: [ 22, 23, 24 ] } } },
     {
       $project:
          {
            _id: 0,
            a: 1,
            b: 1,
            c: 1,
            result: { $setUnion: [ "$a", "$b", "$c" ] }
          }
     }
   ]
) 

Резултат:

{ "a" :[ 1, 2 ], "b" :[ 1, 2 ], "c" :[ 1, 2 ], "резултат" :[ 1, 2 ] }{ "a" :[ 1, 2 ], "b" :[ 1, 2 ], "c" :[ 1, 2, 3 ], "резултат" :[ 1, 2, 3 ] }{ "a" :[ 1, 2 ], "b" :[ 1, 2 ], "c" :[ 4, 5 ], "резултат" :[ 1, 2, 4, 5 ] }

  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. Как да разположите Percona Server за MongoDB за висока наличност

  2. MongoDB сравнява дати само без времена

  3. Как да конкатенираме низове в SQL

  4. Как да изчислим разликата в времевата марка в mongodb (в часове)?

  5. MongoDB $addToSet