MongoDB疯了?匹配错误的文档

MongoDB疯了?匹配错误的文档,mongodb,truncation,Mongodb,Truncation,我在64位Ubuntu 12.04版本上使用MongoDB 2.2.3。我的Mongo Shell中的输出如下: >db.clusters.findOne({'_id':-3118541015882674000}) { "_id" : NumberLong("-3118541015882673983"), "members" : [ { "participationCoeff" : 1, "tweetID" :

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

这里发生的事情是,JavaScript不能以本机方式表示64位整数,如
-3118541015882673983
,因此当将
NumberLong
值转换为JS 64位浮点值时,它会失去精度,最终变成
-3118541015882674000

您可以在mongo shell中看到这一点:

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

因此,在本例中,您将证明查询中的
\u id
为64位浮点,因此mongo将数字文档
\u id
转换为相同的数据类型,以便对它们进行比较并获得匹配。

这里发生的事情是JavaScript不能以本机方式表示64位整数,如
-311854101588673983
,因此,当将
NumberLong
值转换为JS 64位浮点值时,它会失去精度,最终变成
-3118541015882674000

您可以在mongo shell中看到这一点:

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

因此,在本例中,您正在将查询中的
\u id
证明为64位浮点,因此mongo将数字文档
\u id
转换为相同的数据类型,以便对它们进行比较并获得匹配。

但这打破了我的逻辑。我正在使用python为集群集合查找_id值。如果MongoDB必须进行这种“魔法”施法,它应该已经通知了!但这打破了我的逻辑。我正在使用python为集群集合查找_id值。如果MongoDB必须进行这种“魔法”施法,它应该已经通知了!