MongoDB 3.2 maakt het nu mogelijk om gegevens uit meerdere collecties te combineren tot één via de $lookup-aggregatiefase. Laten we als praktisch voorbeeld stellen dat u gegevens over boeken heeft die zijn opgesplitst in twee verschillende collecties.
Eerste verzameling, genaamd books
, met de volgende gegevens:
{
"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"
}
En de tweede collectie, genaamd books_selling_data
, met de volgende gegevens:
{
"_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
}
Om beide collecties samen te voegen is het gewoon een kwestie van $lookup op de volgende manier gebruiken:
db.books.aggregate([{
$lookup: {
from: "books_selling_data",
localField: "isbn",
foreignField: "isbn",
as: "copies_sold"
}
}])
Na deze aggregatie worden de books
collectie ziet er als volgt uit:
{
"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
}
]
}
Het is belangrijk om een paar dingen op te merken:
- De "from" collectie, in dit geval
books_selling_data
, kan niet worden geshard. - Het "as"-veld zal een array zijn, zoals in het bovenstaande voorbeeld.
- Zowel de "localField"- als de "foreignField"-opties in het $lookup-stadium worden voor vergelijkingsdoeleinden als nul behandeld als ze niet voorkomen in hun respectievelijke collecties (de $lookup-documenten hebben daar een perfect voorbeeld van). li>
Dus, als conclusie, als je beide collecties wilt consolideren, in dit geval een vlak 'copy_sold'-veld met het totale aantal verkochte exemplaren, zul je wat meer moeten werken, waarschijnlijk met behulp van een intermediaire collectie die, dan, wees $uit voor de laatste collectie.