MongoDB
 sql >> Base de données >  >> NoSQL >> MongoDB

MongoDB :combiner les données de plusieurs collections en une seule... comment ?

MongoDB 3.2 permet désormais de combiner les données de plusieurs collections en une seule via l'étape d'agrégation $lookup. À titre d'exemple pratique, disons que vous avez des données sur les livres réparties en deux collections différentes.

Première collection, appelée books , ayant les données suivantes :

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

Et la deuxième collection, appelée books_selling_data , ayant les données suivantes :

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

Pour fusionner les deux collections, il suffit d'utiliser $lookup de la manière suivante :

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

Après cette agrégation, les books la collection ressemblera à ceci :

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

Il est important de noter quelques points :

  1. La collection "de", dans ce cas books_selling_data , ne peut pas être fragmenté.
  2. Le champ "as" sera un tableau, comme dans l'exemple ci-dessus.
  3. Les options "localField" et "foreignField" de l'étape $lookup seront traitées comme nulles à des fins de correspondance si elles n'existent pas dans leurs collections respectives (la documentation $lookup en est un parfait exemple).

Donc, en conclusion, si vous voulez consolider les deux collections, ayant, dans ce cas, un champ plat copies_sold avec le total des copies vendues, vous devrez travailler un peu plus, probablement en utilisant une collection intermédiaire qui, alors, soyez $out à la collection finale.