sql >> Base de Datos >  >> NoSQL >> MongoDB

MongoDB:combine datos de varias colecciones en una... ¿cómo?

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:

  1. La colección "de", en este caso books_selling_data , no se puede fragmentar.
  2. El campo "como" será una matriz, como en el ejemplo anterior.
  3. 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.