MongoTemplate 更新为同一文档在数组中设置多个对象

MongoTemplate Update Set Multiple Objects in Array for same Document

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

详细说明,我的人口普查是一个已经存在的对象,列表中有 10 名员工:

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

我想用一些新信息更新现有员工。所以我使用 mongo 文档 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);

当我尝试更新它以一次完成所有这些时,那没有用。我现在意识到我的方法并没有真正意义,所以我不会 post 它(基本上围绕 .addCriteria 和 for 循环中的 update.set 为提供的列表中的每个员工执行此操作) .出现如下错误:"Due to limitations of the com.mongodb.BasicDocument, you can't add a second 'employeeList.employeeId' criteria".

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

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

如果不向该现有数组字段添加值 - 那么您是否要向所有文档添加新字段?

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

db.movieDetails.updateOne(

{标题: "The Martian"},
{$set:{poster: "http://ia.media-etc."}}

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

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

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

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