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

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 简介 MongoDB 是一个基于分布式文件存储的NoSQL数据库 由C++语言编写,运行稳定,性能高 旨在为 WE...
    大熊_7d48阅读 37,548评论 1 9
  • 安装 mongodb服务: sudo service mongod/mongodb start sudo serv...
    末版车阅读 605评论 0 0
  • 1. MongoDB 简介 MongoDB是一个可扩展的高性能,开源,模式自由,面向文档的NoSQL,基于分布式文...
    rhlp阅读 1,131评论 0 3
  • 数据库相关 数据库安装和配置 安装之后需要配置环境变量;验证:mongo命令是否有效启动服务端: C:User\A...
    强某某阅读 179评论 0 0
  • Built-In Roles(内置角色): 1. 数据库用户角色:read、readWrite; 2. 数据库管理...
    阿杰Alex阅读 1,462评论 0 1