在Java中使用findOneAndUpdate方法更新MongoDB文档数组元素
当我们无法在字段“d”中插入数组时,是否有人可以查看此问题,如下图所示: [![MongoDB中的JSON结构][1][1]在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>
{
"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);