MongoDB
 sql >> Base de Dados >  >> NoSQL >> MongoDB

MongoDB:Combine dados de várias coleções em uma... como?


O MongoDB 3.2 agora permite combinar dados de várias coleções em uma por meio do estágio de agregação $lookup. Como exemplo prático, digamos que você tenha dados sobre livros divididos em duas coleções diferentes.

Primeira coleção, chamada books , com os seguintes dados:
{
    "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 a segunda coleção, chamada books_selling_data , com os seguintes dados:
{
    "_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 mesclar as duas coleções, basta usar $lookup da seguinte maneira:
db.books.aggregate([{
    $lookup: {
            from: "books_selling_data",
            localField: "isbn",
            foreignField: "isbn",
            as: "copies_sold"
        }
}])

Após essa agregação, os books coleção terá a seguinte aparência:
{
    "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 observar algumas coisas:
  1. A coleção "de", neste caso books_selling_data , não pode ser fragmentado.
  2. O campo "as" será um array, como no exemplo acima.
  3. As opções "localField" e "foreignField" no estágio $lookup serão tratadas como nulas para fins de correspondência se não existirem em suas respectivas coleções (os documentos $lookup têm um exemplo perfeito sobre isso).
  4. l>

Então, como conclusão, se você quiser consolidar as duas coleções, tendo, neste caso, um campo flat copy_sold com o total de cópias vendidas, você terá que trabalhar um pouco mais, provavelmente usando uma coleção intermediária que irá, então, ser $out para a coleção final.