查找:update $push failed with “Resulting document after update is larger than 16777216”问题引起的原因

具体错误

Caused by: com.mongodb.WriteConcernException: { "serverUsed" : "XX.XX.XX.XX:27017" , "ok" : 1 , "n" : 0 , "updatedExisting" : false , "err" : "Resulting document after update is larger than 16777216" , "code" : 17419}

数据库结构:mongodb保存的是,一条数据保存一辆车一天的定位信息,子列保存每10秒的位置信息
查找:update $push failed with “Resulting document after update is larger than 16777216”问题引起的原因_第1张图片
1.这个问题百度基本搜不到,上的谷歌,看了几个之后知道是单个文档超过了16M。

2.按照业务逻辑查询当天的所有数据,并查询每个文件的大小

//查看文件大小
var doc =  db.vmsTrail.findOne({'date':'2019-09-24','imei':"868120219340130"})
print(Object.bsonsize(doc));

发现最大的也不过5位数字。

3.查看代码

3.1 调试
调试查看imei字段,当数据为"868120223261899"时,程序报错。
数据库中查询:

db.vmsTrail.findOne({'date':'2019-09-24','imei':"868120223261899"}),

结果为null

代码已经加了条件判断

Integer count = vmsTrailRepository.countByImeiAndDate(imei,dateFormat);
if(count == 0){
	//插入
	VmsTrail vmsTrail = new VmsTrail();

	vmsTrail.setImei(imei);
	vmsTrail.setCreateTime(new Date());
	vmsTrail.setUpdateTime(new Date());

	List list = new ArrayList();
	list.add(position);
	vmsTrail.setVmsPosition(list);
	vmsTrail.setDate(dateFormat);

	vmsTrailRepository.save(vmsTrail);
}else {
	//更新追加点的轨迹数据
	mongoTemplate.updateMulti(
			new Query(
					new Criteria("imei").is(imei)
							.and("date").is(dateFormat)),
			new Update().push("vmsPosition").each(position), VmsTrail.class);
}

一开始以为是Query().Update().push的问题,再次调试结果给的count是1,仔细检查是dateformat字段为2019-08-06

3.2 数据库查询

var doc =  db.vmsTrail.findOne({'date':'2019-08-06','imei':"868120223261899"})
print(Object.bsonsize(doc));

结果:16777216

找到问题所在,指定日期的这个文件超出了大小,应该是车辆GPS一直开着,并且没有移动,导致的问题。

3.3 解决
优化业务逻辑,增加时间判断,只有当天的数据才插入数据库,避免文件一直增大

你可能感兴趣的:(总结)