0

64ビットのUbuntu12.04ビルドでMongoDB2.2.3を使用しています。私のMongoShellの出力は次のとおりです。

>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ため、その値をJS 64ビット浮動小数点数に変換するとNumberLong精度が低下し、最終的にはになります-3118541015882674000

これはmongoシェルで確認できます。

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

したがって、この場合_id、クエリで64ビット浮動小数点数として証明しているので、mongoは数値ドキュメント_idを同じデータ型に変換して、それらを比較して一致させることができます。

于 2013-02-20T20:50:22.560 に答える