web-dev-qa-db-ja.com

MongoDB:配列内のインデックスによって参照される配列内の単一のサブ要素を更新するにはどうすればよいですか?

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でこの種の更新を行う方法についての明確な説明は見つかりません。

58
Abe

予想通り、方法がわかればクエリは簡単です。 Pythonの構文は次のとおりです。

db["my_collection"].update(
    { "_id": ObjectId(document_id) },
    { "$set": { 'documents.'+str(doc_index)+'.content' : new_content_B}}
)
65
Abe

Mongo Shellのインデックス(例:1)によって参照される配列要素の更新は、インデックス値を直接示すことでも実行できます。

db.my_collection.update(
    {_id : "document_id"},
    {$set : {"my_array.1.content" : "New content B"}}
)
34
tomaskazemekas

Mongoスタイルでは、「$」位置演算子を使用します。詳細については、こちらをご覧ください link .

db.my_collection.update(
  {_id: ObjectId(document_id), my_array.1 : 1 },
  { $set: { "my_array.$.content" : "NEW content B" } }
)
19
Doel
db.my_collection.update(
  {_id: ObjectId(document_id), my_array : { ... old content A ... } },
  { $set: { "my_array.$.content" : "NEW content B" } }
)
5
znbwo

古いコンテンツ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"}})
0
Samuel Cabral