如何在MongoDB中更新特定文档的特定嵌入文档的值?

我的文档中有以下结构:

{ _id : ObjectId("43jh4j343j4j"), array : [ { _arrayId : ObjectId("dsd87dsa9d87s9d7"), someField : "something", someField2 : "something2" }, { _arrayId : ObjectId("sds9a0d9da0d9sa0"), someField : "somethingElse", someField2 : "somethingElse2" } ] } 

我想更新someFieldsomeField2但仅针对数组中的一个项目,即匹配_arrayId的项目 (例如_arrayId : ObjectId("dsd87dsa9d87s9d7") ;并且仅针对此文档(例如_id : ObjectId("43jh4j343j4j") )没有别的。

arrayIds并不是文档所特有的,这就是我需要它来用于特定文档的原因。 如果我想在数组中为它所存在的每个文档更新该值,我可以使用$ positional operator ,但这不是我想要的。

我试图在java中实现这一点,但命令行解决方案也可以。

您仍然可以使用$ positional运算符来完成此操作。 但是您需要指定父文档的objectid以及_arrayidfilter。 以下命令行查询工作正常

 db.so.update({_id:ObjectId("4e719eb07f1d878c5cf7333c"), "array._arrayId":ObjectId("dsd87dsa9d87s9d7")}, {$set:{"array.$.someField":"updated"}}) 

这是RameshVel的解决方案被翻译成java :

  DB db = conn.getDB( "yourDB" ); DBCollection coll = db.getCollection( "yourCollection" ); ObjectId _id = new ObjectId("4e71b07ff391f2b283be2f95"); ObjectId arrayId = new ObjectId("4e639a918dca838d4575979c"); BasicDBObject query = new BasicDBObject(); query.put("_id", _id); query.put("array._arrayId", arrayId); BasicDBObject data = new BasicDBObject(); data.put("array.$.someField", "updated"); BasicDBObject command = new BasicDBObject(); command.put("$set", data); coll.update(query, command); 

…这是如何使用mongo-driver版本> = 3.1(我的是3.2.2):

 final MongoClient mongoClient = new MongoClient(new MongoClientURI(mongoURIString)); final MongoDatabase blogDatabase = mongoClient.getDatabase("yourDB"); MongoCollection postsCollection = blogDatabase.getCollection("yourCollection"); ObjectId _id = new ObjectId("4e71b07ff391f2b283be2f95"); ObjectId arrayId = new ObjectId("4e639a918dca838d4575979c"); Bson filter = Filters.and(Filters.eq( "_id", id ), Filters.eq("array._arrayId", arrayId)); Bson setUpdate = Updates.set("array.$.someField", "updated"); postsCollection.updateOne(postFilter, setUpdate);