1. 由于线上服务使用了阿里云的mongodb(VPC网络),本地测试没有公网访问权限。
为了定位报表问题,不得不同步数据库。
2. 有点懒得写 mongodump 了, 于是 手动使用mongo shell insert几条记录到测试数据库:
{ "_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. 折腾了好久,最终发现 mongo shell下 insert json, 会被默认转成 double 类型。
https://zhidao.baidu.com/question/1961969396649749180.html
在官网https://docs.mongodb.org/v3.0/core/shell-types/
中提到,mongo shell是有类型的。但我们在输入时,一般是这样输入的:
db.item.insert( {_id:2002,amount:78} )
没有指定任何类型,并且,使用的是json格式。问题就来了:json格式只有number类型,并没有细分int、double之类的数字,
那么为了保险起见,显然mongo
shell全部把它存为了double类型。官方显然早就注意到了这个问题,允许在shell中输入数据时指定类型,比如:
db.item.insert( {_id:NumberInt(2009),amount:78,name:"kfsjadlfasfkljeihfdsfkasfjslkfjei"} )
使用NumberInt之类的函数来指定类型。
6. 赶紧 db.adnstats.drop() 删除集合中所有数据。
7. 然后老老实实地导出导入数据吧:
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. 再次运行测试环境的报表,看到结果了。