如何使用mongodb在单个查询中更新值并增加另一个值

时间:2018-05-28 05:50:36

标签: mongodb mongodb-query atomicity mongo-java

有没有办法实现以下目标: -

MyDocument {
    String docId;
    Integer bal;
    Set<String> actions;
}
  1. 我需要使用某个用户操作值更新字段操作,例如

    [a1, a2]
    

    [a1, a2, a3]
    
  2. 同时,此添加的操作可以将bal增加一些值,因此我需要确保bal字段也实现了$inc操作。< / p>

  3. 实现这一目标的一种方法我可以想到的是使用一个更新查询来增加bal

    Bson searchFilter = Filters.in("docId", <someId>);
    
    // couldn't find a cleaner way of increment in mongo-java
    BasicDBObject modifiedObject = new BasicDBObject();
    modifiedObject.put("$inc", new BasicDBObject().append("bal",2)); // any value to increment
    
    mongoCollection.updateOne(searchFilter, modifiedObject);
    

    此后,我可以为actions更新集合执行另一个更新文档查询。

    另一种方式可能一直在用这两个字段更新文档。为此:

    • 我必须首先 find 该文档,阅读当前的bal,在应用程序中执行计算。
    • 然后 update 包含两个计算字段的文档。

    在上述两种方法中,我都看不到避免两次查询数据库的方法。目前还有其他可行方法可以实现吗?

    此外,我担心上述 [UPDATE + UPDATE] [GET + UPDATE] 组合的原子性,因为可能会出现多个此类并发查询,是否有理由担心?

    请让我知道所需的任何进一步细节。

0 个答案:

没有答案