MongoDB 3.2 umożliwia teraz łączenie danych z wielu kolekcji w jeden na etapie agregacji $lookup. Jako praktyczny przykład powiedzmy, że masz dane o książkach podzielone na dwie różne kolekcje.
Pierwsza kolekcja o nazwie books
, posiadający następujące dane:
{
"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"
}
I druga kolekcja o nazwie books_selling_data
, posiadający następujące dane:
{
"_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
}
Aby połączyć obie kolekcje, wystarczy użyć $lookup w następujący sposób:
db.books.aggregate([{
$lookup: {
from: "books_selling_data",
localField: "isbn",
foreignField: "isbn",
as: "copies_sold"
}
}])
Po tej agregacji books
kolekcja będzie wyglądać następująco:
{
"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
}
]
}
Należy zwrócić uwagę na kilka rzeczy:
- Kolekcja „from”, w tym przypadku
books_selling_data
, nie można podzielić na fragmenty. - Pole „as” będzie tablicą, jak w powyższym przykładzie.
- Opcje „localField” i „foreignField” na etapie $lookup będą traktowane jako puste w celu dopasowania, jeśli nie istnieją w odpowiednich kolekcjach (dokumentacja $lookup ma na to doskonały przykład).
Podsumowując, jeśli chcesz skonsolidować obie kolekcje, mając w tym przypadku płaskie pole kopie_sprzedane z całkowitą liczbą sprzedanych egzemplarzy, będziesz musiał popracować trochę więcej, prawdopodobnie korzystając z kolekcji pośredniej, która wtedy wyjdź do ostatecznej kolekcji.