MongoDB 3.2 ahora permite combinar datos de múltiples colecciones en una a través de la etapa de agregación $lookup. Como ejemplo práctico, supongamos que tiene datos sobre libros divididos en dos colecciones diferentes.
Primera colección, llamada books
, teniendo los siguientes datos:
{
"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"
}
Y la segunda colección, llamada books_selling_data
, teniendo los siguientes datos:
{
"_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
}
Para fusionar ambas colecciones es solo cuestión de usar $lookup de la siguiente manera:
db.books.aggregate([{
$lookup: {
from: "books_selling_data",
localField: "isbn",
foreignField: "isbn",
as: "copies_sold"
}
}])
Después de esta agregación, los books
la colección tendrá el siguiente aspecto:
{
"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 importante tener en cuenta algunas cosas:
- La colección "de", en este caso
books_selling_data
, no se puede fragmentar. - El campo "como" será una matriz, como en el ejemplo anterior.
- Tanto las opciones "localField" como "foreignField" en la etapa de $búsqueda se tratarán como nulas para fines de coincidencia si no existen en sus respectivas colecciones (los documentos de $búsqueda tienen un ejemplo perfecto al respecto).
Entonces, como conclusión, si quieres consolidar ambas colecciones, teniendo, en este caso, un campo plano de copias_vendidas con el total de copias vendidas, tendrás que trabajar un poco más, probablemente usando una colección intermedia que, entonces, estar $fuera de la colección final.