查找: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}數(shù)據(jù)庫結(jié)構:mongodb保存的是,一條數(shù)據(jù)保存一輛車一天的定位信息,子列保存每10秒的位置信息
1.這個問題百度基本搜不到,上的谷歌,看了幾個之后知道是單個文檔超過了16M。
2.按照業(yè)務邏輯查詢當天的所有數(shù)據(jù),并查詢每個文件的大小
//查看文件大小 var doc = db.vmsTrail.findOne({'date':'2019-09-24','imei':"868120219340130"}) print(Object.bsonsize(doc));發(fā)現(xiàn)最大的也不過5位數(shù)字。
3.查看代碼
3.1 調(diào)試
調(diào)試查看imei字段,當數(shù)據(jù)為"868120223261899"時,程序報錯。
數(shù)據(jù)庫中查詢:
代碼已經(jīng)加了條件判斷
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<VmsPosition> list = new ArrayList<VmsPosition>();list.add(position);vmsTrail.setVmsPosition(list);vmsTrail.setDate(dateFormat);vmsTrailRepository.save(vmsTrail); }else {//更新追加點的軌跡數(shù)據(jù)mongoTemplate.updateMulti(new Query(new Criteria("imei").is(imei).and("date").is(dateFormat)),new Update().push("vmsPosition").each(position), VmsTrail.class); }一開始以為是Query().Update().push的問題,再次調(diào)試結(jié)果給的count是1,仔細檢查是dateformat字段為2019-08-06
3.2 數(shù)據(jù)庫查詢
var doc = db.vmsTrail.findOne({'date':'2019-08-06','imei':"868120223261899"}) print(Object.bsonsize(doc));結(jié)果:16777216找到問題所在,指定日期的這個文件超出了大小,應該是車輛GPS一直開著,并且沒有移動,導致的問題。
3.3 解決
優(yōu)化業(yè)務邏輯,增加時間判斷,只有當天的數(shù)據(jù)才插入數(shù)據(jù)庫,避免文件一直增大
總結(jié)
以上是生活随笔為你收集整理的查找:update $push failed with “Resulting document after update is larger than 16777216”问题引起的原因的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 记录一个db2 中LISTAGG函数问题
- 下一篇: Beyond Compare 中文乱码解