MongoDB: Combine data from multiple collections into one..how?

后端 未结 11 1262
余生分开走
余生分开走 2020-11-22 06:44

How can I (in MongoDB) combine data from multiple collections into one collection?

Can I use map-reduce and if so then how?

I would greatly appreciate some

11条回答
  •  无人共我
    2020-11-22 07:44

    MongoDB 3.2 now allows one to combine data from multiple collections into one through the $lookup aggregation stage. As a practical example, lets say that you have data about books split into two different collections.

    First collection, called books, having the following data:

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

    And the second collection, called books_selling_data, having the following data:

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

    To merge both collections is just a matter of using $lookup in the following way:

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

    After this aggregation, the books collection will look like the following:

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

    It is important to note a few things:

    1. The "from" collection, in this case books_selling_data, cannot be sharded.
    2. The "as" field will be an array, as the example above.
    3. Both "localField" and "foreignField" options on the $lookup stage will be treated as null for matching purposes if they don't exist in their respective collections (the $lookup docs has a perfect example about that).

    So, as a conclusion, if you want to consolidate both collections, having, in this case, a flat copies_sold field with the total copies sold, you will have to work a little bit more, probably using an intermediary collection that will, then, be $out to the final collection.

提交回复
热议问题