MongoDB 使用 Java 中的 findOneAndUpdate 方法记录更新数组元素

MongoDB document update array element using findOneAndUpdate method in Java

谁能看看这个问题,因为我们无法在字段 'd' 中插入数组,如下图所示:

[![JSON MongoDB][1]][1]

中的结构
{
  "id": 12,
  "articles": "art",
  "author": "author"
}

您必须使用 arrayFilters 来更新特定的数组元素(有条件)。 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);

Mongo中的相同更新操作Shell:

var dArray = [ "app", "ban" ];

db.test.updateOne(
   { _id: ObjectId("5e37dc262f5ff4dfc935eb6b") }, 
   { $set: { "session.ps.$[elem].d" : dArray } },
   {
     arrayFilters: [ { "elem.apn": "abcdef" } ]
   }
)



[编辑添加]

用新值 "newVal" 同时更新 apn 将新字符串元素 "gua" 添加到 d数组(如果数组不存在,这将添加一个新数组):

db.test.updateOne(
   { _id: ObjectId("5e37dc262f5ff4dfc935eb6b") }, 
   { 
     $set: { "session.ps.$[elem].apn": "newVal" }
     $push: { "session.ps.$[elem].d" : "gua" } 
   },
   {
     arrayFilters: [ { "elem.apn": "abcdef" } ]
   }
)

上面的Java代码MongoShell代码:

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