6

三重にネストされた配列から属性を削除しようとしていますが、うまくいきません。削除したいデータの例を次に示します。

Controls: [
    {    
        Name: 'ControlNumberOne',
        Submit: {   
            Executes: [
                {
                    Name: 'execute',
                    Type: 0
                },
                {
                    Name: 'anotherExecute',
                    Type: 0
                }
            ]
        }
    },
    {    
        Name: 'ControlNumberTwo',
        Submit: {   
            Executes: [
                {
                    Name: 'anotherFromAnotherControl',
                    Type: 1
                }
            ]
        }
    }

]

次の更新クエリを試しましたが、どれも機能しませんでした:

  • db.Page.update('Controls.Submit.Executes.Type': { $exists : true } }, { $unset : { 'Controls.Submit.Executes.Type' : 1 } }, false, true);)

  • db.Page.update('Controls.Submit.Executes.Type': { $exists : true } }, { $unset : { 'Controls.$.Submit.Executes.$.Type' : 1 } }, false, true);)

ただし、実行するdb.Page.find('Controls.Submit.Executes.Type': { $exists : true } })と、まだ Type 属性を持つすべての実行が返されます。

これは達成できますか?ありがとう!

4

2 に答える 2

5

ネストされた配列のクエリと更新は、(まだ) MongoDB コマンドで直接サポートされていません。これはクライアント側で行う必要があります。

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

Jira でこの問題を参照してください: https://jira.mongodb.org/browse/SERVER-831および stackoverflow でこのスレッド: Mongo update of subdocs

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

db.xx.find(
    {'Controls.Submit.Executes.Type': { $exists : true } }
).forEach( function(doc) {
    doc.Controls.forEach( function(c) {
        c.Submit.Executes.forEach( function(e) {
            if ( e.Type != undefined ) delete e.Type;        
        });
    });
    db.xx.update({_id: doc._id},{$set:{Controls:doc.Controls}});
});

結果は次のとおりです。

> db.xx.findOne()
{
    "Controls" : [
        {
            "Name" : "ControlNumberOne",
            "Submit" : {
                "Executes" : [
                    {
                        "Name" : "execute"
                    },
                    {
                        "Name" : "anotherExecute"
                    }
                ]
            }
        },
        {
            "Name" : "ControlNumberTwo",
            "Submit" : {
                "Executes" : [
                    {
                        "Name" : "anotherFromAnotherControl"
                    }
                ]
            }
        }
    ],
    "_id" : ObjectId("5159ff312ee0f7d445b03f32")
}
于 2013-04-01T22:10:38.113 に答える