2013-02-20 2 views
0

Я использую MongoDB 2.2.3 на 64-битной сборке Ubuntu 12.04. Выход в моем Монго Shell является следующее:MongoDB ушел в ярость? Соответствие неправильного документа

>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

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

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

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

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

+0

Но это ломает мою логику. Я использую python для поиска значений _id для коллекции кластеров. Если MongoDB должен сделать это «волшебное» броска, он должен был уведомить! – VaidAbhishek