MongoDB 3.2 ora consente di combinare i dati di più raccolte in una sola attraverso la fase di aggregazione $lookup. Come esempio pratico, supponiamo che tu abbia dati sui libri suddivisi in due raccolte diverse.
Prima raccolta, chiamata books
, avente i seguenti dati:
{
"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"
}
E la seconda raccolta, chiamata books_selling_data
, avente i seguenti dati:
{
"_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
}
Per unire entrambe le raccolte basta usare $lookup nel modo seguente:
db.books.aggregate([{
$lookup: {
from: "books_selling_data",
localField: "isbn",
foreignField: "isbn",
as: "copies_sold"
}
}])
Dopo questa aggregazione, i books
la raccolta sarà simile alla seguente:
{
"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
}
]
}
È importante notare alcune cose:
- La raccolta "da", in questo caso
books_selling_data
, non può essere suddiviso. - Il campo "as" sarà un array, come nell'esempio sopra.
- Entrambe le opzioni "localField" e "foreignField" nella fase $lookup verranno considerate nulle ai fini della corrispondenza se non esistono nelle rispettive raccolte (il $lookup docs ne ha un esempio perfetto).
Quindi, in conclusione, se vuoi consolidare entrambe le raccolte, avendo, in questo caso, un campo piatto copie_vendute con il totale delle copie vendute, dovrai lavorare un po' di più, probabilmente utilizzando una raccolta intermedia che, quindi, essere $out alla raccolta finale.