MongoDB 3.2 ermöglicht es nun, Daten aus mehreren Sammlungen über die $lookup-Aggregationsphase zu einer zu kombinieren. Nehmen wir als praktisches Beispiel an, dass Sie Daten zu Büchern haben, die in zwei verschiedene Sammlungen aufgeteilt sind.
Erste Sammlung, genannt books
, mit folgenden Daten:
{
"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"
}
Und die zweite Sammlung namens books_selling_data
, mit folgenden Daten:
{
"_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
}
Um beide Sammlungen zusammenzuführen, müssen Sie nur $lookup auf folgende Weise verwenden:
db.books.aggregate([{
$lookup: {
from: "books_selling_data",
localField: "isbn",
foreignField: "isbn",
as: "copies_sold"
}
}])
Nach dieser Aggregation werden die books
Die Sammlung sieht wie folgt aus:
{
"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
}
]
}
Es ist wichtig, ein paar Dinge zu beachten:
- Die "From"-Sammlung, in diesem Fall
books_selling_data
, kann nicht geteilt werden. - Das "as"-Feld ist ein Array, wie im obigen Beispiel.
- Sowohl die Optionen "localField" als auch "foreignField" auf der $lookup-Stufe werden für Vergleichszwecke als null behandelt, wenn sie nicht in ihren jeweiligen Sammlungen vorhanden sind (die $lookup-Dokumentation enthält ein perfektes Beispiel dafür).
Wenn Sie also beide Sammlungen konsolidieren möchten und in diesem Fall ein flaches Feld copy_sold mit den insgesamt verkauften Exemplaren haben, müssen Sie etwas mehr arbeiten, wahrscheinlich mit einer Zwischensammlung, die dann $out in die endgültige Sammlung sein.