MongoDB 3.2 giver nu mulighed for at kombinere data fra flere samlinger til én gennem $lookup-aggregeringsstadiet. Som et praktisk eksempel, lad os sige, at du har data om bøger opdelt i to forskellige samlinger.
Første samling, kaldet books
, der har følgende data:
{
"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"
}
Og den anden samling, kaldet books_selling_data
, der har følgende 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
}
At flette begge samlinger er blot et spørgsmål om at bruge $lookup på følgende måde:
db.books.aggregate([{
$lookup: {
from: "books_selling_data",
localField: "isbn",
foreignField: "isbn",
as: "copies_sold"
}
}])
Efter denne sammenlægning vil books
samlingen ser sådan ud:
{
"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
}
]
}
Det er vigtigt at bemærke et par ting:
- "fra"-samlingen, i dette tilfælde
books_selling_data
, kan ikke sønderdeles. - Feltet "som" vil være et array, som eksemplet ovenfor.
- Både "localField"- og "foreignField"-muligheder på $lookup-stadiet vil blive behandlet som null for matchende formål, hvis de ikke findes i deres respektive samlinger ($lookup-dokumenterne har et perfekt eksempel på det).
Så som en konklusion, hvis du ønsker at konsolidere begge samlinger, og i dette tilfælde har et fladt copies_sold felt med det samlede antal solgte kopier, bliver du nødt til at arbejde lidt mere, sandsynligvis ved at bruge en mellemliggende samling, der vil være $ude til den endelige samling.