MongoDB 3.2 nyní umožňuje kombinovat data z více kolekcí do jedné prostřednictvím fáze agregace $lookup. Jako praktický příklad řekněme, že máte data o knihách rozdělená do dvou různých sbírek.
První sbírka nazvaná books
s následujícími údaji:
{
"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"
}
A druhá kolekce s názvem books_selling_data
s následujícími údaji:
{
"_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
}
Ke sloučení obou kolekcí stačí použít $lookup následujícím způsobem:
db.books.aggregate([{
$lookup: {
from: "books_selling_data",
localField: "isbn",
foreignField: "isbn",
as: "copies_sold"
}
}])
Po této agregaci books
kolekce bude vypadat následovně:
{
"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
}
]
}
Je důležité si uvědomit několik věcí:
- Sbírka „od“, v tomto případě
books_selling_data
, nelze skartovat. - Pole „as“ bude pole, jako ve výše uvedeném příkladu.
- Obě možnosti „localField“ a „foreignField“ ve fázi $lookup budou pro účely porovnávání považovány za nulové, pokud v příslušných kolekcích neexistují (dokud je toho dokonalý příklad dokument $lookup). li>
Takže na závěr, pokud chcete sloučit obě sbírky a mít v tomto případě ploché pole copy_sold s celkovým počtem prodaných kopií, budete muset trochu více pracovat, pravděpodobně s použitím zprostředkovatelské sbírky, která pak být $out do finální kolekce.