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();
它并没有真正解决尝试多次更新同一个文档的问题,但它现在对我有用。
我有一个采用文档 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();
它并没有真正解决尝试多次更新同一个文档的问题,但它现在对我有用。