MongoDB
 sql >> Cơ Sở Dữ Liệu >  >> NoSQL >> MongoDB

Loại bỏ các bản sao khi sử dụng $ unionWith trong MongoDB

Trong MongoDB, $unionWith giai đoạn đường ống tổng hợp thực hiện kết hợp hai tập hợp và nó bao gồm các bản sao.

Điều này hoạt động theo cách tương tự như UNION ALL của SQL , cũng bao gồm các bản sao. Ngược lại, chỉ sử dụng UNION (tức là không có ALL ) trong SQL loại bỏ các bản sao.

Trong MongoDB, chúng tôi không có tùy chọn chỉ định $unionWith ALL hoặc tương tự, vì vậy chúng tôi cần giảm các bản sao theo một cách khác.

Trong MongoDB, chúng tôi có thể xóa các bản sao bằng cách sử dụng $group sân khấu.

Ví dụ

Giả sử chúng ta chèn các tài liệu sau vào hai bộ sưu tập; một con được gọi là cats và một cái khác được gọi là 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 }
    ]) 

Và giả sử chúng ta chạy truy vấn sau để trả về tất cả các tên từ cả hai tập hợp:

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

Kết quả:

 {"name":"Fluffy"} {"name":"Scratch"} {"name":"Meow"} {"name":"Wag"} {"name":"Bark"} {" tên ":" Fluffy "} 

Chúng ta có thể thấy rằng cái tên Fluffy xuất hiện hai lần. Điều này là do có hai con Fluffy trong bộ sưu tập của chúng tôi - một con ở cats bộ sưu tập và một trong dogs bộ sưu tập.

Điều này là tốt nếu chúng tôi hài lòng khi có các giá trị trùng lặp. Nhưng nếu chúng ta không làm như vậy thì sao? Điều gì sẽ xảy ra nếu chúng ta chỉ muốn một danh sách các tên riêng biệt từ cả hai bộ sưu tập?

Đó là nơi mà $group giai đoạn xuất hiện.

Chúng ta có thể thêm $group chuyển sang name , để nó trông giống như sau:

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

Kết quả:

 {"_id":"Meow"} {"_id":"Bark"} {"_id":"Scratch"} {"_id":"Wag"} {"_id":"Fluffy"}  

Lần này, chúng tôi chỉ nhận được 5 tài liệu thay vì 6 và chỉ có một Fluffy.


  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. Cách định cấu hình SELinux cho Bộ bản sao MongoDB

  2. phân trang mảng mongoDB

  3. 2 cách xóa bộ sưu tập trong MongoDB

  4. Tìm một chuỗi trong một chuỗi trong SQL

  5. Mảng Mongodb $ push và $ pull