mongoTemplate批量更新内嵌文档
文档数据结果如下:
{
"_id" : ObjectId("5bc5ba4643316cae44d25e82"),
"codeRepertoryId" : NumberLong(106308243837562880),
"batch" : "201810161815320159312",
"type" : 0,
"code" : [
{
"value" : "DCKJ1539684932119392271",
"activityType" : 1,
"status" : 1,
"url" : "http://dingchang.co/",
"productName" : "aaa",
"baseName" : "测试基地",
"columnSort" : 0
},
{
"value" : "DCKJ1539684932119382271",
"activityType" : 1,
"status" : 1,
"url" : "",
"productName" : "aaa",
"baseName" : "测试基地",
"columnSort" : 1
}
],
"createDate" : ISODate("2018-10-16T10:15:32.119Z"),
"abbreviationName" : "DCKJ",
"_class" : "co.dc.saas.code.po.CodeStorePo"
}
mongodb文档格式如上,现在想根据batch更新code数组中的全部对象的status、productName、baseName属性。经过一番测试后,发现mongoTemplate默认只更新数组的第一个对象,google过后发现mongodb不支持批量更新。
解决思路:
获取一下code数组的长度,然后遍历更新!
// 获取码列表长度
Query queryOne = new Query();
queryOne.addCriteria(Criteria.where("batch").is(codeRepertoryDataPo.getBatch()));
CodeStorePo codeStorePo = mongoTemplate.findOne(queryOne, CodeStorePo.class);
int codeLength = codeStorePo.getCode().size();
// 更新操作
Query updateQuery = new Query();
// 根据batch查询
updateQuery.addCriteria(Criteria.where("batch").is(codeRepertoryDataPo.getBatch()));
Update update = new Update();
// 遍历更新
for (int i = 0; i < codeLength; i++) {
// 设置产品名称
update.set("code." + i + ".productName", productName);
// 设置基地名称
update.set("code." + i + ".baseName", baseName);
// 设置为已激活
update.set("code." + i + ".status", 1);
}
mongoTemplate.updateMulti(updateQuery, update, CodeStorePo.class);