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

Премахнете дубликатите, когато използвате $unionWith в MongoDB

В MongoDB, $unionWith Етапът на конвейера на агрегация извършва обединение на две колекции и включва дубликати.

Това се държи по подобен начин на UNION ALL на SQL , което включва и дубликати. За разлика от това, използвайки само UNION (т.е. без ALL )в SQL премахва дубликатите.

В MongoDB нямаме опцията да посочим $unionWith ALL или подобен, така че трябва да намалим дубликатите по друг начин.

В MongoDB можем да премахнем дубликати, като използваме $group сцена.

Пример

Да предположим, че вмъкваме следните документи в две колекции; един, наречен cats и друг, наречен dogs :

db.cats.insertMany([
    { _id: 1, name: "Fluffy", type: "Cat", weight: 5 },
    { _id: 2, name: "Scratch", type: "Cat", weight: 3 },
    { _id: 3, name: "Meow", type: "Cat", weight: 7 }
    ])

db.dogs.insertMany([
    { _id: 1, name: "Wag", type: "Dog", weight: 20 },
    { _id: 2, name: "Bark", type: "Dog", weight: 10 },
    { _id: 3, name: "Fluffy", type: "Dog", weight: 40 }
    ]) 

И да предположим, че изпълняваме следната заявка, за да върнем всички имена от двете колекции:

db.cats.aggregate( [
   { $project: { name: 1, _id: 0 } },
   { $unionWith: { coll: "dogs", pipeline: [ { $project: { name: 1, _id: 0 } } ]} }
] ) 

Резултат:

{ "name" :"Fluffy" }{ "name" :"Scratch" }{ "name" :"Meow" }{ "name" :"Wag" }{ "name" :"Bark" }{ " име" :"Пухкав" }

Можем да видим, че името Fluffy се появява два пъти. Това е така, защото в нашите колекции има два Fluffys – единият в cats колекция и един в dogs колекция.

Това е добре, ако сме щастливи да имаме дублиращи се стойности. Но какво ще стане, ако не го направим? Ами ако искаме само списък с различни имена от двете колекции?

Това е мястото, където $group етап идва.

Можем да добавим $group етап до name поле, така че да изглежда така:

db.cats.aggregate( [
   { $project: { name: 1, _id: 0 } },
   { $unionWith: { coll: "dogs", pipeline: [ { $project: { name: 1, _id: 0 } } ]} },
   { $group: { _id: "$name" } }
] ) 

Резултат:

{ "_id" :"Мяу" }{ "_id" :"Ла" }{ "_id" :"Надраскване" }{ "_id" :"Размахване" }{ "_id" :"Пухкав" } 

Този път получаваме само 5 документа вместо 6 и има само един Fluffy.


  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. Групиране по специфичен елемент от масив с рамка за агрегиране mongo

  2. Как да настроите useMongoClient (Mongoose 4.11.0)?

  3. Използване на резервни копия за коригиране на често срещани сценарии за отказ за MongoDB

  4. импортиране на JSON в mongoDB с помощта на pymongo

  5. Mongo DB намира всички записи с най-висока стойност в зависимост от ключово поле