mongodb 数组更新

原因:线上数据中,数组项某个value存在前置空格
# 数据格式如下(手动输入的,json串格式可能有问题):
{
"categoryId":99999,
"categoryType":23,
"keyValue":[
	{"key":"key1","value":" value1"},
	{"key":"key2","value":"value2"},
	{"key":"key3","value":"value3"},
	{"key":"key4","value":"value4"}
]
}
# 存在空格的数据为 key="key1"
导致原因
	用户在提交时不小心加了个空格(可能是复制粘贴的),程序也没有对这部分做处理;
	本来可以从后台管理系统修改,但是咨询产品,这部分修改貌似有问题,但记不清楚了(才维护的项目,流量巨大-类目项目)
	根据目前看来只能采取走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。但是他说可能通过把现有数组所有数据放到修改项中,这样应该可以了修改吧。
		觉得他说的有道理,就在测试环境测试一番,结果可行
最终解决方案
	# remove
	db.getCollection('category***').remove({"categoryId":9999})

	# find
	db.getCollection('category***').find({"categoryId":9999})

	# insert
	db.getCollection('category***').insert({"categoryId":9999,"categoryType":23,"keyValue":[{"key":"key1","value":" value1"},{"key":"key2","value":"value2"},{"key":"key3","value":"value3"}]})

	# update
	db.getCollection('category***').update({"categoryId":9999},{$set:{"keyValue":[{"key":"key1","value":"value1"},{"key":"key2","value":"value2"},{"key":"key3","value":"value3"}]}})

	# 就是通过上面4条语句来回测试即可 会存在将线上数据考下来格式问题,通过类似于notePad++之类的文本编辑工具替换即可,相信大家都会
	# 你懂的  问题就是这样解决的  好开森,可以去洗澡了
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值