Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在Java中使用findOneAndUpdate方法更新MongoDB文档数组元素_Java_Arrays_Mongodb_Mongodb Java - Fatal编程技术网

在Java中使用findOneAndUpdate方法更新MongoDB文档数组元素

在Java中使用findOneAndUpdate方法更新MongoDB文档数组元素,java,arrays,mongodb,mongodb-java,Java,Arrays,Mongodb,Mongodb Java,当我们无法在字段“d”中插入数组时,是否有人可以查看此问题,如下图所示: [![MongoDB中的JSON结构][1][1] { "id": 12, "articles": "art", "author": "author" } 必须使用更新特定数组元素(带有条件)。Java中的数组过滤器是用FindOneAndUpdateOptions对象定义的 List<Bson>

当我们无法在字段“d”中插入数组时,是否有人可以查看此问题,如下图所示:

[![MongoDB中的JSON结构][1][1]

{
  "id": 12,
  "articles": "art",
  "author": "author"
}
必须使用更新特定数组元素(带有条件)。Java中的数组过滤器是用
FindOneAndUpdateOptions
对象定义的

List<Bson> arrFilters = new ArrayList<>();
arrFilters.add(new Document("elem.apn", "abcdef")); // this specifies the element search criteria
FindOneAndUpdateOptions updateOptions = new FindOneAndUpdateOptions().arrayFilters(arrFilters);

String [] dArray = { "app", "ban", "ora" }; // the "d" array to be added
Bson update = set("session.ps.$[elem].d", Arrays.asList(dArray));

String idStr = "5e37dc262f5ff4dfc935eb6b";
Bson queryFilter = eq("_id", new ObjectId(idStr));

Document result = coll.findOneAndUpdate(queryFilter, update, updateOptions);
System.out.println(result);


[编辑和添加]

同时使用新值“newVal”更新
apn
,并向
d
数组中添加一个新的字符串元素“gua”(如果数组不存在,这将添加一个新数组):

上述Mongo Shell代码的Java代码:

List<Bson> arrayFilters = new ArrayList<>();
arrayFilters.add(new Document("elem.apn", "abcdef"));
FindOneAndUpdateOptions updateOptions = 
    new FindOneAndUpdateOptions().arrayFilters(arrayFilters);   

Bson pushUpdate = push("session.ps.$[elem].d", "gua");
Bson setUpdate = set("session.ps.$[elem].apn", "newValue");
Bson update = combine(pushUpdate, setUpdate);

String idStr = "5e37dc262f5ff4dfc935eb6b";
Bson queryFilter = eq("_id", new ObjectId(idStr));

Document result = coll.findOneAndUpdate(queryFilter, update, updateOptions);
List arrayFilters=new ArrayList();
添加(新文档(“元素apn”、“abcdef”);
FindOneAndUpdateOptions更新选项=
新建FindOneAndUpdateOptions().arrayFilters(arrayFilters);
Bson pushUpdate=push(“session.ps.$[elem].d”,“gua”);
Bson setUpdate=set(“session.ps.$[elem].apn”,“newValue”);
Bson update=联合收割机(推送更新,设置日期);
字符串idStr=“5e37dc262f5ff4dfc935eb6b”;
Bson queryFilter=eq(“_id”,新ObjectId(idStr));
文档结果=coll.findOneAndUpdate(queryFilter,update,updateOptions);

(1)
eq
set
静态方法来自
com.mongodb.client.model.Filters
com.mongodb.client.model.Updates
类。谢谢,但问题是我们需要同时更新apn字段,而这并没有发生。请解释“…我们需要同时更新apn字段”.我添加了Mongo外壳代码。请检查它是否是您想要的-相同的更新查询使用新提供的值另外更新
apn
字段。让我们来看看。
db.test.updateOne(
   { _id: ObjectId("5e37dc262f5ff4dfc935eb6b") }, 
   { 
     $set: { "session.ps.$[elem].apn": "newVal" }
     $push: { "session.ps.$[elem].d" : "gua" } 
   },
   {
     arrayFilters: [ { "elem.apn": "abcdef" } ]
   }
)
List<Bson> arrayFilters = new ArrayList<>();
arrayFilters.add(new Document("elem.apn", "abcdef"));
FindOneAndUpdateOptions updateOptions = 
    new FindOneAndUpdateOptions().arrayFilters(arrayFilters);   

Bson pushUpdate = push("session.ps.$[elem].d", "gua");
Bson setUpdate = set("session.ps.$[elem].apn", "newValue");
Bson update = combine(pushUpdate, setUpdate);

String idStr = "5e37dc262f5ff4dfc935eb6b";
Bson queryFilter = eq("_id", new ObjectId(idStr));

Document result = coll.findOneAndUpdate(queryFilter, update, updateOptions);