MongoDB疯了吗?匹配错误的文件

时间:2013-02-20 20:15:38

标签: mongodb truncation

我在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字段没有相同的值。

1 个答案:

答案 0 :(得分:4)

这里发生的是JavaScript本身不能代表-3118541015882673983这样的64位整数,所以当将NumberLong值转换为JS 64位浮点数时,它会失去精度并结束最新为-3118541015882674000

你可以在mongo shell中看到这个:

> num = NumberLong("-3118541015882673983")
NumberLong("-3118541015882673983")
> num.toNumber()
-3118541015882674000

因此,在这种情况下,您将查询中的_id证明为64位浮点数,因此mongo将数字文档_id转换为相同的数据类型,以便它们可以比较,你得到一个匹配。