mongo shell直接insert json时的bug——int也变double

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. 再次运行测试环境的报表,看到结果了。

你可能感兴趣的:(mongo shell直接insert json时的bug——int也变double)