【问题标题】:MongoDB document update array element using findOneAndUpdate method in JavaMongoDB 文档使用 Java 中的 findOneAndUpdate 方法更新数组元素
【发布时间】:2020-02-03 07:45:38
【问题描述】:

有人可以看看这个问题,因为我们无法在字段“d”中插入数组,如下图所示:

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

{
  "id": 12,
  "articles": "art",
  "author": "author"
}

【问题讨论】:

    标签: java arrays mongodb mongodb-java


    【解决方案1】:

    您必须使用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 数组(如果数组没有,这将添加一个新数组' t 存在):

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

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

    【讨论】:

    • (1) eqset 静态方法来自 com.mongodb.client.model.Filterscom.mongodb.client.model.Updates 类。
    • 谢谢,但问题是我们需要同时更新 apn 字段,但没有发生。
    • 请解释一下"...我们需要同时更新apn字段".
    • 我添加了 Mongo Shell 代码。请检查它是否是您想要的 - 相同的更新查询还会使用新提供的值更新 apn 字段。
    猜你喜欢
    • 2016-10-15
    • 1970-01-01
    • 1970-01-01
    • 2022-08-02
    • 2019-04-07
    • 1970-01-01
    • 1970-01-01
    • 2022-01-22
    • 2022-12-05
    相关资源
    最近更新 更多