MongoDB 3.2 вече позволява да се комбинират данни от множество колекции в една чрез етапа на агрегиране на $lookup. Като практически пример, нека да кажем, че имате данни за книги, разделени на две различни колекции.
Първата колекция, наречена books
, със следните данни:
{
"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"
}
И втората колекция, наречена books_selling_data
, със следните данни:
{
"_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
}
Обединяването на двете колекции е просто въпрос на използване на $lookup по следния начин:
db.books.aggregate([{
$lookup: {
from: "books_selling_data",
localField: "isbn",
foreignField: "isbn",
as: "copies_sold"
}
}])
След това агрегиране books
колекцията ще изглежда по следния начин:
{
"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
}
]
}
Важно е да се отбележат няколко неща:
- Колекцията „от“, в този случай
books_selling_data
, не може да се раздели. - Полето „as“ ще бъде масив, както е примерът по-горе.
- И двете опции „localField“ и „foreignField“ на етапа $lookup ще бъдат третирани като нулеви за целите на съвпадението, ако не съществуват в съответните им колекции (документите $lookup имат перфектен пример за това).
Така че, като заключение, ако искате да консолидирате и двете колекции, като в този случай имате плоско поле copies_sold с общия брой продадени копия, ще трябва да работите малко повече, вероятно като използвате междинна колекция, която ще, $out до окончателната колекция.