MongoDB ушел в ярость? Соответствие неправильного документа

106
12

Я использую MongoDB 2.2.3 на 64-битной сборке Ubuntu 12.04. Выходной файл в моей 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 не имеет одинакового значения.

спросил(а) 2013-02-20T23:15:00+04:00 7 лет, 3 месяца назад
1
Решение
84

Что здесь происходит, так это то, что JavaScript не может изначально представлять 64-битные целые числа, такие как -3118541015882673983, поэтому при преобразовании этого значения NumberLong в 64-битный поплавок JS он теряет точность и заканчивается как -3118541015882674000.

Вы можете увидеть это в оболочке монго:

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

Так что в этом случае вы доказав _id в запросе в виде 64-битной плавающей точкой, так Монго преобразует цифровой DOC _id к тому же типу данных, так что их можно сравнить, и вы получите матч.

ответил(а) 2013-02-20T23:50:00+04:00 7 лет, 3 месяца назад
Ваш ответ
Введите минимум 50 символов
Чтобы , пожалуйста,
Выберите тему жалобы:

Другая проблема