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

サブドキュメントのMongoアップデート

    配列をフラット化すると、かなり大きなドキュメントになる可能性があります。これは、すべての内側の配列要素について、その外側の要素のすべてのデータを繰り返す必要があるためです(これはすべてのレベルで)。

    したがって、フラット化がオプションでない場合は、前述のJira(サーバー-831 ):

    • ドキュメントを変数に読み込みます
    • アレイを操作する
    • ドキュメントを更新し、配列全体を書き換えます

    あなたの例を考えると、これは次のようになります:

    doc = db.xx.findOne( {_id:1} );
    doc.properties.forEach( function(p) {
        if ( p.property_id == 2 ) { 
            p.tags.forEach( function(t) {
               if ( t.tag_id == 3 ) {
                   t.tag_value = 100;
               }
               else if ( t.tag_id == 4 ) {
                   newChannel = {};
                   newChannel.channel_id = 5;
                   newChannel.channel_name = "test5";
                   t.channels.push(newChannel);
               }
            })
        }
    });
    db.xx.update({_id:1},{$set:{properties:doc.properties}});
    

    結果は次のとおりです。

    doc = db.xx.findOne({_id:1})
    {
        "_id" : 1,
        "properties" : [
            {
                "property_id" : 1,
                "tags" : [
                    {
                        "tag_id" : 1,
                        "tag_value" : 1000,
                        "channels" : [
                            {
                                "channel_id" : 1,
                                "channel_name" : "test1"
                            },
                            {
                                "channel_id" : 2,
                                "channel_name" : "test2"
                            }
                        ]
                    },
                    {
                        "tag_id" : 2,
                        "tag_value" : 2500,
                        "channels" : [
                            {
                                "channel_id" : 2,
                                "channel_name" : "test2"
                            },
                            {
                                "channel_id" : 3,
                                "channel_name" : "test3"
                            }
                        ]
                    }
                ]
            },
            {
                "property_id" : 2,
                "tags" : [
                    {
                        "tag_id" : 3,
                        "tag_value" : 100,
                        "channels" : [
                            {
                                "channel_id" : 1,
                                "channel_name" : "test1"
                            },
                            {
                                "channel_id" : 3,
                                "channel_name" : "test3"
                            }
                        ]
                    },
                    {
                        "tag_id" : 4,
                        "tag_value" : 5000,
                        "channels" : [
                            {
                                "channel_id" : 1,
                                "channel_name" : "test1"
                            },
                            {
                                "channel_id" : 5,
                                "channel_name" : "test5"
                            }
                        ]
                    }
                ]
            }
        ]
    }
    



    1. Springを使用して認証が必要なMongoDBに接続する方法

    2. Django-Mongodbリストフィールドを持つNonrel

    3. mongo:リターンはcount()と等しくありません

    4. MongoDBとC#ドライバーを使用してサブドキュメントコレクションをクエリする方法