原因:线上数据中,数组项某个value存在前置空格
{
"categoryId":99999,
"categoryType":23,
"keyValue":[
{"key":"key1","value":" value1"},
{"key":"key2","value":"value2"},
{"key":"key3","value":"value3"},
{"key":"key4","value":"value4"}
]
}
导致原因
用户在提交时不小心加了个空格(可能是复制粘贴的),程序也没有对这部分做处理;
本来可以从后台管理系统修改,但是咨询产品,这部分修改貌似有问题,但记不清楚了(才维护的项目,流量巨大-类目项目)
根据目前看来只能采取走SQL的方式更新
问题分析
1、通过代码找到使用的mongodb查询语句类似于
mongodb.query("categoryId").is(categoryId).and("categoryType").is(23);
使用命令查询语句为
db.getCollection('category***').find({"categoryId":9999,"categoryType":23})
返回结果如文章开头所示
2、最开始想直接通过update更新,前提是query查询条件为,仅仅查询需要更新这个数组的key和value
3、但网上找这种命令,没有类似的。数组中只有一个属性的倒是一堆攻略,对应尝试写的命令就不公布了(主要是没有记录下来)
4、考虑到使用先删除当前数据,然后使用插入(居然没有想到只更新数组部分)。没有这样做的原因:
1) 这个项目调用量巨大
2) 而且项目启动后,做了大量缓存(处理时不知道),涉及到mongodb为实时(不清楚直接删除,会对缓存更新是否及时)
3) 关键是要的急,接手后一直未修改项目内容
4) 通过类目ID调用这个流量具体有多少
5) 可能是因为调用量大吧,大部分接口返回数据多,没有记录入参和出参
5、后来想到个折中的办法
1) 线上通过mongodb工具可以查看数据(貌似可以申请修改数据权限,那这个问题解决就是几秒钟的事)
2) 询问dba,能否通过这种方式修改,前提还是要走jira(项目管理功能句)
3) dba回答是NO,通过update更新
6、结果又转回来了 😓
无意间问起同事,之前处理过类似问题没,结果告诉我来公司没有用过mongodb。但是他说可能通过把现有数组所有数据放到修改项中,这样应该可以了修改吧。
觉得他说的有道理,就在测试环境测试一番,结果可行
最终解决方案
db.getCollection('category***').remove({"categoryId":9999})
db.getCollection('category***').find({"categoryId":9999})
db.getCollection('category***').insert({"categoryId":9999,"categoryType":23,"keyValue":[{"key":"key1","value":" value1"},{"key":"key2","value":"value2"},{"key":"key3","value":"value3"}]})
db.getCollection('category***').update({"categoryId":9999},{$set:{"keyValue":[{"key":"key1","value":"value1"},{"key":"key2","value":"value2"},{"key":"key3","value":"value3"}]}})