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

MongoDB:Kết hợp dữ liệu từ nhiều bộ sưu tập thành một..bằng cách nào?

MongoDB 3.2 hiện cho phép một người kết hợp dữ liệu từ nhiều tập hợp thành một thông qua giai đoạn tổng hợp $ lookup. Ví dụ thực tế, giả sử rằng bạn có dữ liệu về sách được chia thành hai bộ sưu tập khác nhau.

Bộ sưu tập đầu tiên, được gọi là books , có dữ liệu sau:

{
    "isbn": "978-3-16-148410-0",
    "title": "Some cool book",
    "author": "John Doe"
}
{
    "isbn": "978-3-16-148999-9",
    "title": "Another awesome book",
    "author": "Jane Roe"
}

Và bộ sưu tập thứ hai, được gọi là books_selling_data , có dữ liệu sau:

{
    "_id": ObjectId("56e31bcf76cdf52e541d9d26"),
    "isbn": "978-3-16-148410-0",
    "copies_sold": 12500
}
{
    "_id": ObjectId("56e31ce076cdf52e541d9d28"),
    "isbn": "978-3-16-148999-9",
    "copies_sold": 720050
}
{
    "_id": ObjectId("56e31ce076cdf52e541d9d29"),
    "isbn": "978-3-16-148999-9",
    "copies_sold": 1000
}

Để hợp nhất cả hai bộ sưu tập chỉ cần sử dụng $ lookup theo cách sau:

db.books.aggregate([{
    $lookup: {
            from: "books_selling_data",
            localField: "isbn",
            foreignField: "isbn",
            as: "copies_sold"
        }
}])

Sau tổng hợp này, books bộ sưu tập sẽ giống như sau:

{
    "isbn": "978-3-16-148410-0",
    "title": "Some cool book",
    "author": "John Doe",
    "copies_sold": [
        {
            "_id": ObjectId("56e31bcf76cdf52e541d9d26"),
            "isbn": "978-3-16-148410-0",
            "copies_sold": 12500
        }
    ]
}
{
    "isbn": "978-3-16-148999-9",
    "title": "Another awesome book",
    "author": "Jane Roe",
    "copies_sold": [
        {
            "_id": ObjectId("56e31ce076cdf52e541d9d28"),
            "isbn": "978-3-16-148999-9",
            "copies_sold": 720050
        },
        {
            "_id": ObjectId("56e31ce076cdf52e541d9d28"),
            "isbn": "978-3-16-148999-9",
            "copies_sold": 1000
        }
    ]
}

Điều quan trọng cần lưu ý là:

  1. Bộ sưu tập "từ", trong trường hợp này là books_selling_data , không thể chia nhỏ.
  2. Trường "as" sẽ là một mảng, như ví dụ ở trên.
  3. Cả hai tùy chọn "localField" và "ForeignField" trong giai đoạn $ lookup sẽ được coi là null cho các mục đích phù hợp nếu chúng không tồn tại trong các bộ sưu tập tương ứng của chúng ($ lookup docs có một ví dụ hoàn hảo về điều đó).

Vì vậy, kết luận là, nếu bạn muốn hợp nhất cả hai bộ sưu tập, trong trường hợp này, có trường Copy_sold phẳng với tổng số bản sao đã bán, bạn sẽ phải làm việc nhiều hơn một chút, có thể là sử dụng bộ sưu tập trung gian, sau đó, là $ ra bộ sưu tập cuối cùng.



  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. Cách dễ nhất để sao chép / sao chép một phiên bản tài liệu mongoose?

  2. Làm thế nào để thực hiện các hoạt động mongodb thô trong mongoose?

  3. nhóm theo ngày trong mongodb

  4. Xác thực MongoDB-CR không thành công

  5. Làm cách nào để truy vấn MongoDB trực tiếp từ Ruby thay vì sử dụng Mongoid?