当前位置: 首页 > 知识库问答 >
问题:

如何使用MongoDB Java驱动程序更新数组中的对象?

郝哲茂
2023-03-14

你好,我有这个文件

{
  email: "email@gmail.com",
  list: [
    {
      "product": "Car",
      "price": 18
    },
    {
      "product": "Boat",
      "price": 20 
    }
  ]
}

我想知道如何使用email参数识别文档,并通过查找带有“Car”参数的产品并使用MongoDB Java驱动程序将价格更新为15来更新列表参数中的特定对象。

谢谢你

共有1个答案

公孙弘图
2023-03-14

有两种方法可以根据条件更新数组字段的嵌套文档。

(1) 使用位置$Operator进行更新:

positional$操作符充当与查询文档匹配的第一个元素的占位符,数组字段必须作为查询文档的一部分出现;i、 例如,“list.product”:“Car”。其次,只更新第一个匹配的数组元素。

db.collection.updateOne( 
  { email: "email@gmail.com", "list.product": "Car" }, 
  { $set: { "list.$.price": 15 } } 
)

(2) 使用筛选的位置$[identifier]运算符更新:

过滤后的位置运算符$[identifier]标识与更新操作的arrayFilters条件匹配的数组元素。

注意:使用$[identifier]update操作符时,数组字段上的条件不是必需的。其次,所有匹配的数组元素(“product”:“Car”)都将更新。

db.collection.updateOne( 
  { email: "email@gmail.com" }, 
  { $set: { "list.$[ele].price": 15 } },
  { arrayFilters: [ { "ele.product": "Car" } ] }
)

使用MongoDBJava驱动更新:

案例一:

Bson filter = and(eq("email", "email@gmail.com"), eq("list.product", "Car"));
Bson update = set("list.$.price", 15);
UpdateResult result = coll.updateOne(filter, update);

案例2:

Bson filter = eq("email", "email@gmail.com");
UpdateOptions options = new UpdateOptions()
                              .arrayFilters(asList(eq("ele.product", "Car")));
Bson update = set("list.$[ele].price", 15);
UpdateResult result = coll.updateOne(filter, update, options);

参考:MongoDB Java驱动程序

 类似资料:
  • 我的目标是使用聚合框架创建一个管道来对我的数据进行分组,然后将这个管道与java驱动程序一起使用。MongoDB v4.0.3 我使用MongoDB Compass创建了以下管道(减少到重要部分): 这导致以下(生成的)Java代码: 集合中$组阶段之前的数据如下所示: $组阶段应返回以下数据结构: 问题所在 Mongo Compass按预期预览了阶段的结果,但使用java驱动程序的阶段的结果非常

  • 问题内容: 我目前正在尝试使用Firestore,但遇到了非常简单的问题:“更新数组(又称子文档)”。 我的数据库结构非常简单。例如: 我正在尝试(没有成功)将新记录推入对象数组。 我试过了: 没有效果。这些查询将覆盖我的数组。 答案可能很简单,但我找不到它… 问题答案: 当前无法在Cloud Firestore中更新单个数组元素(或添加/删除单个元素)。 这段代码在这里: 这是说,在设置文件,使

  • 问题内容: 参考文献: http://www.mongodb.org/display/DOCS/Java+Tutorial 对于mongo db来说还算是新手,但是我正在尝试更新集合中现有文档的一部分…不幸的是,上面的链接没有更新示例。 本质上,我只希望能够: 向文档添加新字段 将文档的现有字段更新为新值 这是我的代码(Grails + Groovy + Java + MongoDB + Java

  • 问题内容: 您好,我想将chrome驱动程序更新到最新版本,但ant会找到有关更新驱动程序的任何信息,只是有关安装它的信息。我需要怎么做才能将驱动程序更新到最新版本? 问题答案: chromedriver是一个独立的可执行文件。只需将您的现有版本替换为较新的版本即可。 从https://sites.google.com/a/chromium.org/chromedriver/downloads下载

  • 如何更新数组元素子文档中的特定字段? 我的问题类似于下面的问题,但是在我的例子中,我只需要更新一个子文档值。 MongoDB:如何更新数组中由数组中的索引引用的单个子元素? 我有以下文档模型: 所以,在mongodb shell中,以下语句非常适合我: 然而,当我尝试使用MongoJava驱动程序时,我会得到一个IllegalArgumentException。 它会引发以下异常: 我的代码有问题

  • 在Selenium PageObjects中,我没有实例化任何web驱动程序实例,也没有如下所示进行编码 我试图在Selenium Page对象函数中实现以下代码。 有谁能建议我,在使用页面对象模型时,如何在上述代码中使用webdriver实例?