ここに大きな質問があります。Mongoの「addToSet」および「push」操作を活用する必要がありますか?配列内の個々のアイテムだけを変更することを本当に計画している場合は、おそらくこれらの配列をオブジェクトとして構築する必要があります。
これを構成する方法は次のとおりです。
{
id: 1,
items:
{
"2" : { "blocks" : { "3" : { txt : 'hello' } } },
"5" : { "blocks" : { "1" : { txt : 'foo'}, "2" : { txt : 'bar'} } }
}
}
これは基本的にすべてを配列ではなくJSONオブジェクトに変換します。 $push
を使用できなくなります および$addToSet
しかし、これですべてが簡単になると思います。たとえば、クエリは次のようになります。
db.objects.update({'items.2': {$exists:true} }, {'$set': {'items.2.blocks.0.txt': 'hi'}})
また、「ID」をダンプしたことにも気付くでしょう。このようなものをネストする場合は、通常、「ID」をその番号をインデックスとして使用するだけで置き換えることができます。 「ID」の概念が暗示されるようになりました。
この機能は、表現力豊かなアップデートで3.6に追加されました。
db.objects.update( {id: 1 }, { $set: { 'items.$[itm].blocks.$[blk].txt': "hi", } }, { multi: false, arrayFilters: [ { 'itm.id': 2 }, { 'blk.id': 3} ] } )