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

$groupと$pushを使用したMongoDb集計クエリをサブドキュメントに追加

    次の集計パイプラインを実行してみてください。重要なのは、最後の $project attendeeContainerを作成するためのパイプライン サブドキュメント:

    db.event.aggregate([
        { "$unwind": "$attendeeContainer.attendees" },
        {
            "$lookup" : { 
                "from" : "contactinfo", 
                "localField" : "attendeeContainer.attendees.contact",
                "foreignField" : "_id", 
                "as" : "attendeeContainer.attendees.contactInfo" 
            }
        },
        { "$unwind": "$attendeeContainer.attendees.contactInfo" },
        {
            "$group": {
                "_id" : "$_id",
                "name": { "$first": "$name" },   
                "min" : { "$first": "$attendeeContainer.min" },
                "max" : { "$first": "$attendeeContainer.max" },
                "attendees": { "$push": "$attendeeContainer.attendees" }            
            }
        },
        {
            "$project": {
                "name": 1,
                "attendeeContainer.min": "$min",
                "attendeeContainer.max": "$min",
                "attendeeContainer.attendees": "$attendees"
            }
        }
    ])
    

    デバッグのヒント

    第4段階でパイプラインをデバッグすると、結果が得られます

    db.event.aggregate([
        { "$unwind": "$attendeeContainer.attendees" },
        {
            "$lookup" : { 
                "from" : "contactinfo", 
                "localField" : "attendeeContainer.attendees.contact",
                "foreignField" : "_id", 
                "as" : "attendeeContainer.attendees.contactInfo" 
            }
        },
        { "$unwind": "$attendeeContainer.attendees.contactInfo" },
        {
            "$group": {
                "_id": "$_id",
                "name": { "$first": "$name" },   
                "min" : { "$first": "$attendeeContainer.min" },
                "max" : { "$first": "$attendeeContainer.max" },
                "attendees": { "$push": "$attendeeContainer.attendees" }            
            }
        }/*,
        {
            "$project": {
                "name": 1,
                "attendeeContainer.min": "$min",
                "attendeeContainer.max": "$min",
                "attendeeContainer.attendees": "$attendees"
            }
        }*/
    ])
    

    パイプラインの結果

    {
        "_id" : ObjectId("582c789282a9183adc0b53f5"),
        "name" : "Some Event",
        "min" : 0,
        "max" : 10,
        "attendees" : [ 
            {
                "type" : 1,
                "status" : 2,
                "contact" : ObjectId("582c787682a9183adc0b53f3"),
                "contactInfo" : {
                    "_id" : ObjectId("582c787682a9183adc0b53f3"),
                    "name" : "John Doe",
                    "age" : 35
                }
            }, 
            {
                "type" : 7,
                "status" : 4,
                "contact" : ObjectId("582c787682a9183adc0b53f4"),
                "contactInfo" : {
                    "_id" : ObjectId("582c787682a9183adc0b53f4"),
                    "name" : "Peter Pan",
                    "age" : 60
                }
            }
        ]
    }
    

    そして最後の $project> パイプラインはあなたに望ましい結果を与えるでしょう:

    db.event.aggregate([
        { "$unwind": "$attendeeContainer.attendees" },
        {
            "$lookup" : { 
                "from" : "contactinfo", 
                "localField" : "attendeeContainer.attendees.contact",
                "foreignField" : "_id", 
                "as" : "attendeeContainer.attendees.contactInfo" 
            }
        },
        { "$unwind": "$attendeeContainer.attendees.contactInfo" },
        {
            "$group": {
                "_id": "$_id",
                "name": { "$first": "$name" },   
                "min" : { "$first": "$attendeeContainer.min" },
                "max" : { "$first": "$attendeeContainer.max" },
                "attendees": { "$push": "$attendeeContainer.attendees" }            
            }
        },
        {
            "$project": {
                "name": 1,
                "attendeeContainer.min": "$min",
                "attendeeContainer.max": "$min",
                "attendeeContainer.attendees": "$attendees"
            }
        }/**/
    ])
    

    望ましい/実際の出力

    {
        "_id" : ObjectId("582c789282a9183adc0b53f5"),
        "name" : "Some Event",
        "attendeeContainer" : {
            "min" : 0,
            "max" : 10,
            "attendees" : [ 
                {
                    "type" : 1,
                    "status" : 2,
                    "contact" : ObjectId("582c787682a9183adc0b53f3"),
                    "contactInfo" : {
                        "_id" : ObjectId("582c787682a9183adc0b53f3"),
                        "name" : "John Doe",
                        "age" : 35
                    }
                }, 
                {
                    "type" : 7,
                    "status" : 4,
                    "contact" : ObjectId("582c787682a9183adc0b53f4"),
                    "contactInfo" : {
                        "_id" : ObjectId("582c787682a9183adc0b53f4"),
                        "name" : "Peter Pan",
                        "age" : 60
                    }
                }
            ]
        }
    }
    



    1. NestJSでサーバー側のページ付けを提供するにはどうすればよいですか?

    2. 高可用性のためにOpenedXMongoDBデータベースをデプロイする方法

    3. Guidを文字列としてMongoDBに保存することの欠点は何ですか?

    4. レート制限GETリクエスト