MongoDB
 sql >> Database >  >> NoSQL >> MongoDB

MongoDB:combina i dati di più raccolte in una... come?

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:

  1. La raccolta "da", in questo caso books_selling_data , non può essere suddiviso.
  2. Il campo "as" sarà un array, come nell'esempio sopra.
  3. 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.