Mongodbドキュメントの配列内に含まれる単一のサブ要素を更新しようとしています。配列インデックスを使用してフィールドを参照します(配列内の要素には一意の識別子であることを保証できるフィールドがありません)。これは簡単にできるように思えますが、構文がわかりません。
疑似JSONでやりたいことは次のとおりです。
前:
{
_id : ...,
other_stuff ... ,
my_array : [
{ ... old content A ... },
{ ... old content B ... },
{ ... old content C ... }
]
}
後:
{
_id : ...,
other_stuff ... ,
my_array : [
{ ... old content A ... },
{ ... NEW content B ... },
{ ... old content C ... }
]
}
クエリは次のようになっているようです:
//pseudocode
db.my_collection.update(
{_id: ObjectId(document_id), my_array.1 : 1 },
{my_array.$.content: NEW content B }
)
しかし、これは機能しません。 mongodbのドキュメントを検索し、この構文でさまざまなバリエーションを試してみました(たとえば、$slice
など)。 MongoDBでこの種の更新を行う方法についての明確な説明は見つかりません。
予想通り、方法がわかればクエリは簡単です。 Pythonの構文は次のとおりです。
db["my_collection"].update(
{ "_id": ObjectId(document_id) },
{ "$set": { 'documents.'+str(doc_index)+'.content' : new_content_B}}
)
Mongo Shellのインデックス(例:1)によって参照される配列要素の更新は、インデックス値を直接示すことでも実行できます。
db.my_collection.update(
{_id : "document_id"},
{$set : {"my_array.1.content" : "New content B"}}
)
Mongoスタイルでは、「$」位置演算子を使用します。詳細については、こちらをご覧ください link .
db.my_collection.update(
{_id: ObjectId(document_id), my_array.1 : 1 },
{ $set: { "my_array.$.content" : "NEW content B" } }
)
db.my_collection.update(
{_id: ObjectId(document_id), my_array : { ... old content A ... } },
{ $set: { "my_array.$.content" : "NEW content B" } }
)
古いコンテンツBのキーが例ごとに「値」である場合、配列内の要素のインデックスを渡すmongoDBのupdateOne関数を使用できます。
[
...
"value" : "old content A"
"value" : "old content B"
"value" : "old content C"
...
]
コマンドは次のようになります。
db.collection.updateOne({"_id" : "...,"},{$set: {"my_array.1.value": "NEW content B"}})