我在64位Ubuntu 12.04版本上使用MongoDB 2.2.3。我的Mongo Shell中的输出如下:
>db.clusters.findOne({'_id':-3118541015882674000})
{
"_id" : NumberLong("-3118541015882673983"),
"members" : [
{
"participationCoeff" : 1,
"tweetID" : NumberLong("-3118541015882673983")
},
{
"participationCoeff" : 0.6666666666666666,
"tweetID" : NumberLong("-7489837299951056630")
},
{
"participationCoeff" : 0.5,
"tweetID" : NumberLong("-4808081224284120148")
}
]
}
如您所见,匹配条件中给出的数字不与返回的数字相同。 _id字段没有相同的值。
答案 0 :(得分:4)
这里发生的是JavaScript本身不能代表-3118541015882673983
这样的64位整数,所以当将NumberLong
值转换为JS 64位浮点数时,它会失去精度并结束最新为-3118541015882674000
。
你可以在mongo shell中看到这个:
> num = NumberLong("-3118541015882673983")
NumberLong("-3118541015882673983")
> num.toNumber()
-3118541015882674000
因此,在这种情况下,您将查询中的_id
证明为64位浮点数,因此mongo将数字文档_id
转换为相同的数据类型,以便它们可以比较,你得到一个匹配。