mongodb $inc修改上的一个bug
发布于 4天前 作者 kiroChen 220 次浏览 来自 问答

前几天在mongodb数据库上发现一个数据类型为number,值为4.199999999999999的数据,如图, QQ截图20150629093920.png 感觉很奇怪。 查看了nodejs的代码。发现唯一修改这个数据的程序是用了$inc修改器。本着重现bug情景的原则,重新建立了一条新的数据。如图 QQ截图20150629092429.png 执行了语句, QQ截图20150629092438.png 第一次发现正常执行,但是重复执行了六次之后,奇怪的事发生了。产生了这样的结果。 QQ截图20150629092517.png

后来想找一下网上有没有相关的情况发生,结果一无所获,好吧,想到了大神云集的cnode

4 回复

mongo 版本是2.6.7

$inc修改器只能用于整形、长整形、或双精度浮点型的值,如果用在其他类型上就会导致失败。这是《mongodb权威指南-第二版》P37页中的解释。 目测应该是这里的问题。

@haozxuan 但是MongoDB小数都是用的double表示的,这不冲突啊

@kiroChen 小数本来就是一个禁区,关于这部分每个数据库都极力避免,有的索性就不支持。我的侧重点在于应用层设计是否有这个必要?是否可以存成整数? 下面是3.X的mongodb的结果: > db.test.update({},{$set:{num:100}}) >WriteResult({ “nMatched” : 1, “nUpserted” : 0, “nModified” : 1 }) > db.test.find() { “_id” : ObjectId(“5591048564f5d63d9ff66db4”), “num” : 100 } > db.test.update({},{$inc:{num:0.1}}) WriteResult({ “nMatched” : 1, “nUpserted” : 0, “nModified” : 1 }) > db.test.find() { “_id” : ObjectId(“5591048564f5d63d9ff66db4”), “num” : 100.1 } > db.test.update({},{$inc:{num:0.1}}) WriteResult({ “nMatched” : 1, “nUpserted” : 0, “nModified” : 1 }) > db.test.find() { “_id” : ObjectId(“5591048564f5d63d9ff66db4”), “num” : 100.19999999999999 }

回到顶部