最近项目使用到mongoDB来存储部分数据,使用spring 封装的mongoTemplate来进行对mongoDB操作。总结一波,供大家参考。
这里默认大家已经把环境配置好。如没有,请参考:
MongoTemplate入门_rainreboot的博客-CSDN博客_mongotemplate
数据格式如下:
[{
"_id": {
"$oid": "638ffe9fc86654666dec9df4"
},
"communityCode": "111",
"deviceId": 37,
"buildStructureInfoId": "1A1-B1-U1-F1-H1-D3-",
"deviceParameterTemplates": [{
"parameterTemplateName": "模板1",
"parameterTemplateCode": "UserSyncConfigure",
"parameterTemplateId": "42",
"parentTemplateId": "41",
"version":"1.0",
"deviceParameterTemplateItems": [{
"itemName": "参数项1",
"itemCode": "code1",
"dataType": "2",
"itemValue": "1111"
},
{
"itemName": "参数项2",
"itemCode": "code2r",
"dataType": "2",
"itemValue": ""
}
]
},
{
"parameterTemplateName": "模板2",
"parameterTemplateCode": "backgroundConfigure",
"parameterTemplateId": "55",
"parentTemplateId": "41",
"version":"1.0",
"deviceParameterTemplateItems": [{
"itemName": "参数3",
"itemCode": "code3",
"dataType": "2",
"itemValue": "1.png",
}]
}
],
"_class": "com.legrand.device.manage.model.mongo.DeviceParameter"
}]
根据数据结构创建model
@NoArgsConstructor
@AllArgsConstructor
@Accessors(chain = true)
@Data
public class DeviceParameter implements Serializable {
/**
*对应_id 不设置时自动生成
*/
@Id
private String deviceParameterId;
private String communityCode;
private Integer deviceId;
private String buildStructureInfoId;
/**
* 设备参数模板
*/
private List<DeviceParameterTemplate> deviceParameterTemplates;
}
@Data
public class DeviceParameterTemplate implements Serializable {
private String parameterTemplateName;
private String parameterTemplateCode;
private String parameterTemplateId;
private String parentTemplateId;
/**
* 设备参数项
*/
private List<DeviceParameterTemplateItem> deviceParameterTemplateItems;
}
@Data
public class DeviceParameterTemplateItem implements Serializable {
private String parameterTemplateCommunityItemId;
private String itemName;
private String itemCode;
private String dataType;
private String itemValue;
}
需求1 更新某一参数项的值并更新模板版本
public void updateDeviceParameterTemplateItem(Integer deviceId,
DeviceParameterTemplateItem deviceParameterTemplateItem, DeviceParameterTemplate deviceParameterTemplate) {
Query query = Query.query(Criteria.where("deviceId").is(deviceId)
.and("deviceParameterTemplates.deviceParameterTemplateItems.itemCode").is(deviceParameterTemplateItem.getItemCode()));
Update update = new Update();
//idx 为自定义数组下标
update.filterArray(Criteria.where("idx.itemCode").is(deviceParameterTemplateItem.getItemCode()));
update.set("deviceParameterTemplates.$[].deviceParameterTemplateItems.$[idx].itemValue", deviceParameterTemplateItem.getItemValue());
//更新模板版本
update.filterArray(Criteria.where("id0.parameterTemplateCode").is(deviceParameterTemplate.getParameterTemplateCode()));
update.set("deviceParameterTemplates.$[id0].version", deviceParameterTemplate.getVersion());
mongoTemplate.updateFirst(query, update, DeviceParameter.class);
}
需求2 批量更新多个设备的同一参数
/**
* 批量更新户下设备参数项
*
* @param buildStructureInfoId 户结构ID
*/
@Override
public void updateDeviceParameterTemplateItemBatch(String buildStructureInfoId,
List<DeviceParameterTemplateItem> deviceParameterTemplateItems) {
//模糊查询
Pattern pattern = Pattern.compile("^" + buildStructureInfoId + ".*$", Pattern.CASE_INSENSITIVE);
Query query = Query.query(Criteria.where("buildStructureInfoId").regex(pattern));
Update update = new Update();
for (DeviceParameterTemplateItem deviceParameterTemplateItem:deviceParameterTemplateItems) {
//idx 为数组下标
update.filterArray(Criteria.where("idx.itemCode").is(deviceParameterTemplateItem.getItemCode()));
update.set("deviceParameterTemplates.$[].deviceParameterTemplateItems.$[idx].itemValue", deviceParameterTemplateItem.getItemValue());
}
mongoTemplate.updateMulti(query, update, DeviceParameter.class);
}
需求3 查询指定模板
public DeviceParameterTemplate findDeviceParameterTemplateByParentTemplateId(Integer deviceId, String parentTemplateId) {
//查询条件
Criteria findModelCriteria = Criteria.where("deviceParameterTemplates.parameterTemplateId").is(parentTemplateId).and("deviceId").is(deviceId);
//使用elemMatch 过滤查询出来的元素
Criteria findFuelCriteria = Criteria.where("deviceParameterTemplates").elemMatch(Criteria.where("parameterTemplateId").is(parentTemplateId));
BasicQuery basicQuery = new BasicQuery(findModelCriteria.getCriteriaObject(), findFuelCriteria.getCriteriaObject());
DeviceParameter deviceParameter = mongoTemplate.findOne(basicQuery, DeviceParameter.class);
DeviceParameterTemplate deviceParameterTemplate = null;
if (deviceParameter != null) {
deviceParameterTemplate = deviceParameter.getDeviceParameterTemplates().get(0);
}
return deviceParameterTemplate;
}