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à:
- Bộ sưu tập "từ", trong trường hợp này là
books_selling_data
, không thể chia nhỏ. - Trường "as" sẽ là một mảng, như ví dụ ở trên.
- 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.