MongoDB
 sql >> Datenbank >  >> NoSQL >> MongoDB

MongoDB:Kombinieren Sie Daten aus mehreren Sammlungen zu einer ... wie?

MongoDB 3.2 ermöglicht es nun, Daten aus mehreren Sammlungen über die $lookup-Aggregationsphase zu einer zu kombinieren. Nehmen wir als praktisches Beispiel an, dass Sie Daten zu Büchern haben, die in zwei verschiedene Sammlungen aufgeteilt sind.

Erste Sammlung, genannt books , mit folgenden Daten:

{
    "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"
}

Und die zweite Sammlung namens books_selling_data , mit folgenden Daten:

{
    "_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
}

Um beide Sammlungen zusammenzuführen, müssen Sie nur $lookup auf folgende Weise verwenden:

db.books.aggregate([{
    $lookup: {
            from: "books_selling_data",
            localField: "isbn",
            foreignField: "isbn",
            as: "copies_sold"
        }
}])

Nach dieser Aggregation werden die books Die Sammlung sieht wie folgt aus:

{
    "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 ist wichtig, ein paar Dinge zu beachten:

  1. Die "From"-Sammlung, in diesem Fall books_selling_data , kann nicht geteilt werden.
  2. Das "as"-Feld ist ein Array, wie im obigen Beispiel.
  3. Sowohl die Optionen "localField" als auch "foreignField" auf der $lookup-Stufe werden für Vergleichszwecke als null behandelt, wenn sie nicht in ihren jeweiligen Sammlungen vorhanden sind (die $lookup-Dokumentation enthält ein perfektes Beispiel dafür).

Wenn Sie also beide Sammlungen konsolidieren möchten und in diesem Fall ein flaches Feld copy_sold mit den insgesamt verkauften Exemplaren haben, müssen Sie etwas mehr arbeiten, wahrscheinlich mit einer Zwischensammlung, die dann $out in die endgültige Sammlung sein.