1. 由于線上服務(wù)使用了阿里云的mongodb(VPC網(wǎng)絡(luò))贡这,本地測試沒有公網(wǎng)訪問權(quán)限。
為了定位報表問題厂榛,不得不同步數(shù)據(jù)庫盖矫。
2. 有點懶得寫 mongodump 了, 于是 手動使用mongo shell insert幾條記錄到測試數(shù)據(jù)庫:
{ "_id" : ObjectId("59a4d2e30c2e52411f7e6666"), "CodeHash" : "d548891edab9c96c42b8a88f110a6cfc", "Time" : NumberLong(1503972000), "Date" : "2017-08-29 10:00:00", "ProductId" : 28, "ProjectId" : 4, "GroupId" : 3, "CreativeId" : 4, "LinkId" : 24, "AdPosId" : "598837a41ad88e01000428c8", "Request" : 11, "ImpNormal" : 0, "ImpInvalid" : 0, "ImpDuplicate" : 0, "ClNormal" : 0, "ClkInvalid" : 0, "ClkDuplicate" : 0, "Cost" : 0 }
3. 更新完后击奶,測試報表就開始報錯 : double 無法cast 成 integer 辈双。
4. 百思不得其解 ! 由于后端代碼也更新過,一直覺得代碼有問題了正歼?
5. 折騰了好久辐马,最終發(fā)現(xiàn) mongo shell下 insert json, 會被默認轉(zhuǎn)成 double 類型局义。
https://zhidao.baidu.com/question/1961969396649749180.html
在官網(wǎng)https://docs.mongodb.org/v3.0/core/shell-types/
中提到喜爷,mongo shell是有類型的。但我們在輸入時萄唇,一般是這樣輸入的:
db.item.insert( {_id:2002,amount:78} )
沒有指定任何類型檩帐,并且,使用的是json格式另萤。問題就來了:json格式只有number類型湃密,并沒有細分int、double之類的數(shù)字四敞,
那么為了保險起見泛源,顯然mongo
shell全部把它存為了double類型。官方顯然早就注意到了這個問題忿危,允許在shell中輸入數(shù)據(jù)時指定類型达箍,比如:
db.item.insert( {_id:NumberInt(2009),amount:78,name:"kfsjadlfasfkljeihfdsfkasfjslkfjei"} )
使用NumberInt之類的函數(shù)來指定類型。
6. 趕緊 db.adnstats.drop() 刪除集合中所有數(shù)據(jù)铺厨。
7. 然后老老實實地導(dǎo)出導(dǎo)入數(shù)據(jù)吧:
mongodump -h 172.17.0.xx --port 10017 --authenticationDatabase admin -u root -p xx -d AdnStats -o /home/mongodump/adnstats
mongorestore -h 101.200.xx.xx --port 10017 --authenticationDatabase admin -u root -p xx -d AdnStats /home/mongodump/adnstats/AdnStats
8. 再次運行測試環(huán)境的報表缎玫,看到結(jié)果了硬纤。