【问题标题】:MongoTemplate Update Set Multiple Objects in Array for same DocumentMongoTemplate 更新为同一文档设置数组中的多个对象
【发布时间】:2020-02-11 03:22:06
【问题描述】:

我有一个端点,它接受一个文档 ID,以及一个嵌套数组中的 Employee 对象,我想更新它。这工作正常。我试图修改端点以接受超过 1 名员工并让它一次更新它们,但我无法让它工作。不知道是不是格式不对,还是不行。

详细来说,我的 Census 是一个已经存在的对象,如下所示,列表中有 10 名员工:

{
  "id": <ID>
  ...
  "employeeList": [
  {
    "employeeId": <Employee_ID>,
    ...
  }
  ...
  ]
}

我想用一些新信息更新现有员工。所以我使用mongo Document ID 来查找文档,然后通过它的EmployeeID 在列表中找到正确的Employee。对于单个员工更新,我可以使用类似的方法:

Query query = new Query().addCriteria(new Criteria("id").is(id))
      .addCriteria(new Criteria("employeeList.employeeId").is(employee.getEmployeeId());
update.set("employeeList.$", employee);

UpdateResult result = mongoTemplate.updateFirst(query, update, Census.class);

当我尝试更新它以一次完成所有操作时,它不起作用。我现在意识到我的方法并没有真正意义,所以我不会发布它(基本上围绕 .addCriteria 和 update.set 在 for 循环中为提供的列表中的每个 Employee 执行此操作)。收到如下错误:“由于 com.mongodb.BasicDocument 的限制,您无法添加第二个 'employeeList.employeeId' 标准”。

我可以吗?是否是连续多次更新此文档的唯一其他选择?我认为这样做比调用端点 X 次更好。我在 Mongo 3.6 上,以防影响任何答案。 TIA。

【问题讨论】:

    标签: java mongodb mongotemplate


    【解决方案1】:

    抱歉,您的帖子不清楚。您显示数组字段 EmployeeList - 您是否要向数组添加值?单个文件还是所有文件?

    如果不向此现有数组字段添加值 - 那么您是否正在寻求向所有文档添加新字段?

    【讨论】:

    • 不,我认为在这种情况下我会使用 update.push。我正在尝试使用 $set 通过其 EmployeeID 获取现有 Employee 并使用一些新信息(即:姓名等)对其进行更新。
    【解决方案2】:

    这里是一个字段更新的例子:海报 对于选定的标题:

    db.movieDetails.updateOne(
    

    {title: "火星人"},
    {$set:{poster: "http://ia.media-etc."}}

    还有 updateMany 你应该看看 Mongo 的在线手册....

    【讨论】:

    • 有点编辑问题 - 它应该是一组带有结束的代码)
    • 这不是使用 MongoTemplate(或 spring boot 中包含的其他包)的 Java 代码。它也没有回答我关于使用 $set 运算符同时更新多个数组对象的问题。
    【解决方案3】:

    对于我的问题,我找不到任何其他答案。所以我最终将其更改为批量更新方法:

    BulkOperations bulkOps = mongoTemplate.bulkOps(BulkMode.UNORDERED, Census.class);
    for(Employee employee : employeeList) {
        Query query = new Query().addCriteria(new Criteria("id").is(id));
        Update update = new Update().set("employeeList.$", employee);
        bulkOps.updateOne(query, update);
    }
    BulkWriteResult results = bulkOps.execute();
    

    它并没有真正解决尝试多次更新同一个文档的问题,但它现在对我有用。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-01-07
      • 1970-01-01
      • 2018-09-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多