sql >> データベース >  >> NoSQL >> MongoDB

MongoDB:複数のコレクションからのデータを1つに結合します。

    MongoDB 3.2では、$ lookupステージを介して、複数のコレクションのデータを1つに結合できるようになりました。実際の例として、本に関するデータが2つの異なるコレクションに分割されているとします。

    booksと呼ばれる最初のコレクション 、次のデータがあります:

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

    そして、books_selling_dataと呼ばれる2番目のコレクション 、次のデータがあります:

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

    両方のコレクションをマージするには、次のように$lookupを使用するだけです。

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

    この集計の後、books コレクションは次のようになります:

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

    いくつかの点に注意することが重要です:

    1. 「from」コレクション、この場合はbooks_selling_data 、シャーディングできません。
    2. 上記の例のように、「as」フィールドは配列になります。
    3. $ lookupステージの「localField」オプションと「foreignField」オプションは、それぞれのコレクションに存在しない場合、照合のためにnullとして扱われます($ lookupドキュメントにその完璧な例があります)。

    したがって、結論として、両方のコレクションを統合する場合は、この場合、販売されたコピーの総数を含むフラットなcopys_soldフィールドを使用する場合は、おそらく中間コレクションを使用して、もう少し作業する必要があります。最終的なコレクションに$outします。



    1. MongoDB $ arrayElemAt

    2. SpringDataMongoDBとJava8LocalDate MappingException

    3. Mongoでの大文字と小文字を区別しない検索

    4. Mongoで$addToSetのキーを指定できますか?