0

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

4

1 回答 1

4

这里发生的事情是 JavaScript 不能原生表示 64 位整数-3118541015882673983,因此当将该NumberLong值转换为 JS 64 位浮点数时,它会失去精度并最终成为-3118541015882674000.

您可以在 mongo shell 中看到:

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

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

于 2013-02-20T20:50:22.560 回答