mongoTemplate 操作内嵌文档

       最近项目使用到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;
    }

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值