版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/yyoc97/article/details/83347769
mongodb复合查询修改内嵌数组指令
- 初始数据
下面是一个collection,名称为 care_field 中的一条数据,集合包含多条数据。其中 baseFieldList 字段为数组复合属性。
{
"_class" : "com.trendy.server.crm.api.care.po.CareFieldPo",
"_id" : ObjectId("5bcd313ea8d5db9f9e95c67c"),
"eventNo" : "OrderSuccess",
"baseFieldList" : [
{
"fieldName" : "会员姓名",
"fieldValue" : "{customer_name}",
"fieldMapper" : "memberName",
"example" : "张三"
},
{
"example" : "普通会员",
"fieldMapper" : "memberGradeId",
"fieldName" : "会员等级",
"fieldValue" : "{customer_grade}"
}]
}
- 需求
1.修改eventNo包含Order的所有数据,在baseFieldList 添加一个会员编号的复合属性。
2.将所有baseFieldList中 fieldMapper = memberGradeId的值改为memberGradeName。
- 命令
update格式就不多赘述。第一个我们利用updateMany进行多行修改,$regex
模糊匹配,$addToSet
添加数组就可以了。
db.getCollection('care_field').updateMany(
{"eventNo":{"$regex":/Order/}},
{$addToSet:
{baseFieldList:{
"fieldName" : "会员编号",
"fieldValue" : "{customer_code}",
"fieldMapper" : "memberNo",
"example" : "53300976"}
}
},{"multi":true})
第二个利用baseFieldList.fieldMapper
查询到子属性为 memberGradeId 的数据,重点就在修改部分里baseFieldList.$.fieldMapper
的$
号了,这里指代所有的行,因为baseFieldList数组如果很多无序的话,我们也不清楚每条数据中会员等级在baseFieldList是第几个。
db.getCollection('care_field').updateMany(
{"baseFieldList.fieldMapper":"memberGradeId"},
{$set:{"baseFieldList.$.fieldMapper":"memberGradeName"}},
{"multi":true})
- 总结
很多零散的知识点大家都晓得,可是网上很难找到多种复合查询,修改内嵌数组的案例。今天遇到一些数据修改需要,量级不算多,但还是情愿把时间用在写命令上,这样也能够保证生产数据修改的准确性。