0

ランタイム コレクションの一部である次のドキュメントを検討してください。

{
"entity_id" : 10,
"features" : [ 
    {
        "10" : "Test System 2"
    }, 
    {
        "20" : "System 2 Description"
    }, 
    {
        "180" : ISODate("2013-12-25T18:19:40.589Z")
    }, 
    {
        "190" : ISODate("2013-12-25T18:19:40.589Z")
    }
],
"_id" : ObjectId("52bb21bc8a2ebdc01c000001")
}

私の目標は、キー「20」を持つ「features」配列の要素の値を更新することです。これが私が試したことです(mongoシェルで):

db.Runtime.findAndModify({ "query" : {"_id": "52bb21bc8a2ebdc01c000001"}, "update" : {$set      : {"features.$.20":"Updated Description"}}} );

db.Runtime.findAndModify({ "query" : {"_id": "52bb21bc8a2ebdc01c000001"}, "update" : {$set : {"features['20']":"Updated Description"}}} );

db.Runtime.findAndModify({ "query" : {"_id": "52bb21bc8a2ebdc01c000001"}, "update" : {$set : {"features[1]":"Updated Description"}}} );

すべてのインスタンスで、シェルは null を出力し、データには何も起こりません。したがって、主な問題は、もちろん、私のコード スニペットの何が問題なのかということです。また、その「null」はどのように解釈されるはずですか? そして、手がかりを見つけることができるモンゴシェルのログのようなものはありますか? 助けてくれて本当にありがとうございます!

4

1 に答える 1

1

更新で位置演算子を使用する場合$、更新する配列の要素と一致する用語をクエリに含める必要があります。

db.Runtime.findAndModify({
    query: {_id: ObjectId("52bb21bc8a2ebdc01c000001"), 
            'features.20': {$exists: true}}, 
    update: {$set: {"features.$.20":"Updated Description"}}
})

実際の文字列に変換するには、文字列をObjectId呼び出す必要もあることに注意してください。そうしないと、ドキュメントと一致しません。_idObjectId

于 2013-12-26T18:58:57.657 に答える