2013-02-20 3 views
0

저는 64 비트 Ubuntu 12.04 빌드에서 MongoDB 2.2.3을 사용하고 있습니다. 당신이 볼 수 있듯이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

은 여기에서 일어나고은 자바 스크립트가 기본적으로 -3118541015882673983 같은 64 비트 정수를 대표 할 수 없다는 것입니다, 그래서 JS 64 비트에 NumberLong 값이 떠 있음을 변환 할 때 정밀도를 잃고 -3118541015882674000로 끝납니다.

당신은 몽고 쉘에서 볼 수 있습니다 : 64 비트 부동 소수점 같이 쿼리에서 _id을 증명하고이 경우에 따라서

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

을 몽고가 동일하게 숫자 문서를 _id의 변환 있도록 데이터 유형을 비교하여 비교할 수 있도록합니다.

+0

하지만 내 논리는 깨집니다. 파이썬을 사용하여 클러스터 컬렉션의 _id 값을 찾습니다. MongoDB가이 '마술'캐스트를해야한다면, 알려야합니다! – VaidAbhishek