Java 如何更新MongoDB中特定文档的数组中特定嵌入文档的值?

Java 如何更新MongoDB中特定文档的数组中特定嵌入文档的值?,java,mongodb,mongodb-java,Java,Mongodb,Mongodb Java,我的文档中有以下结构: { _id : ObjectId("43jh4j343j4j"), array : [ { _arrayId : ObjectId("dsd87dsa9d87s9d7"), someField : "something", someField2 : "something2" }, {

我的文档中有以下结构:

{
  _id : ObjectId("43jh4j343j4j"), 
  array : [
            { 
              _arrayId : ObjectId("dsd87dsa9d87s9d7"),
              someField : "something",
              someField2 : "something2"
            },
            { 
              _arrayId : ObjectId("sds9a0d9da0d9sa0"),
              someField : "somethingElse",
              someField2 : "somethingElse2"
            }
   ]
 }
我想更新someFieldsomeField2,但只更新数组中的一个项目,即与\u arrayId匹配的项目(例如
\u arrayId:ObjectId(“dsd87dsa9d87s9d7”)
;并且只更新此文档(例如
\u id:ObjectId(“43jh4j343j4j”)
),而不更新其他内容

数组ID对于文档不是唯一的,这就是为什么我需要它用于特定文档的原因。如果我想为数组中存在的每个文档更新该值,我可以使用
$positional操作符
,但这不是我想要的


我正试图在中完成此操作,但是命令行解决方案也可以。您仍然可以使用
$positional
运算符来完成此操作。但是您需要指定父文档的objectid以及_arrayid筛选器。下面的命令行查询工作正常

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

以下是RameshVel的解决方案:


…这是如何使用mongo驱动程序版本>=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=新ObjectId(“4e71b07ff391f2b283be2f95”);
ObjectId arrayId=新ObjectId(“4e639a918dca838d4575979c”);
Bson filter=Filters.and(Filters.eq('u id',id),Filters.eq('array.'u arrayId',arrayId));
Bson setUpdate=Updates.set(“array.$.someField”,“updated”);
updateOne(postFilter,setUpdate);

鉴于没有一个答案真正解释了如何使用Java和b)对嵌套数组项中的多个字段执行此操作,以下是mongo Java驱动程序3.12.3的解决方案

import com.mongodb.client.MongoCollection;
import com.mongodb.client.model.Filters;
import com.mongodb.client.model.Updates;
import org.bson.Document;
import org.bson.types.ObjectId;

MongoClient mongoClient = MongoClients.create(...);
MongoDatabase db = mongoClient.getDatabase("testDb");
MongoCollection<Document> collection = db.getCollection("testCollection");
collection.updateOne(
    Filters.and(
            Filters.eq("_id", new ObjectId("43jh4j343j4j")),
            Filters.eq("array._arrayId", new ObjectId("dsd87dsa9d87s9d7"))
    ),
    Updates.combine(
            Updates.set("array.$.someField", "new value 1"),
            Updates.set("array.$.someField2", "new value 2")
    )
);
import com.mongodb.client.MongoCollection;
导入com.mongodb.client.model.Filters;
导入com.mongodb.client.model.Updates;
导入org.bson.Document;
导入org.bson.types.ObjectId;
MongoClient MongoClient=MongoClients.create(…);
MongoDatabase db=mongoClient.getDatabase(“testDb”);
MongoCollection collection=db.getCollection(“testCollection”);
collection.updateOne(
A.和(
Filters.eq(“_id”,新ObjectId(“43jh4j343j4j”),
Filters.eq(“array._arrayId”,新ObjectId(“dsd87dsa9d87s9d7”))
),
更新。合并(
Updates.set(“数组.$.someField”,“新值1”),
Updates.set(“数组.$.someField2”,“新值2”)
)
);

这条线索帮助我找到了正确的解决方案,但我必须为完整的解决方案做更多的研究,因此希望其他人也能从我的答案中受益。

效果很好!谢谢因此,
coll.update(query,data)
中的查询就像一个过滤器,用于查找您要查找的文档,并作为您感兴趣的文档部分的选择器。如果我们通过创建一个数组来增加一个数组级别,该怎么办?我们是否可以编写类似data.put(“array.$.someField.$.anotherField”,“updated”);不为美沙克工作,解决了我的问题。数组。$.field是诀窍(我使用的是3.5)
final MongoClient mongoClient = new MongoClient(new MongoClientURI(mongoURIString));
final MongoDatabase blogDatabase = mongoClient.getDatabase("yourDB");
MongoCollection<Document> 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);
import com.mongodb.client.MongoCollection;
import com.mongodb.client.model.Filters;
import com.mongodb.client.model.Updates;
import org.bson.Document;
import org.bson.types.ObjectId;

MongoClient mongoClient = MongoClients.create(...);
MongoDatabase db = mongoClient.getDatabase("testDb");
MongoCollection<Document> collection = db.getCollection("testCollection");
collection.updateOne(
    Filters.and(
            Filters.eq("_id", new ObjectId("43jh4j343j4j")),
            Filters.eq("array._arrayId", new ObjectId("dsd87dsa9d87s9d7"))
    ),
    Updates.combine(
            Updates.set("array.$.someField", "new value 1"),
            Updates.set("array.$.someField2", "new value 2")
    )
);