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 } ) 

但是这不起作用。 我花了太长时间searchmongodb文档,尝试对这个语法的不同变化(例如使用$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风格中,使用'$'位置运算符。 查看这个链接的细节。

 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" } } )