mongoTemplate批量更新内嵌文档

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

你可能感兴趣的:(MongoDB)