2013-06-04 2 views
0

rails console에 쿼리를 수행 할 때 내가 레일 3 Mongoid을 통해 MongoDB를를 사용하고이 이상한 행동을 관찰 해요 :Mongoid 이상한 쿼리 결과

> Table.where(:field => {"$exists" => true}).count 
=> 3735 
> Table.where(:field => {"$exists" => true}, :field => {"$ne" => ""}).count 
=> 14878 # wtf??? 
> Table.where(:field => {"$exists" => true}, :field => "").count 
=> 0 # at least it's not negative 
> Table.where(:field => {"$exists" => false}).count 
=> 11143 

11143 + 3735 = 14878 때문에, 나는 where(:field => {"$exists" => true}, :field => {"$ne" => ""}):field가있는 레코드를 계산한다고 가정 존재하지 않습니다 (왜냐하면 nil != ""?). 그러나 #where에 나열된 조건은 and과 결합되므로 :field이 빈 문자열이 아니고 AND 인 레코드 만 일치해야합니다.

답변

1

당신은 "그러나 #where에 열거 된 조건은 'and'와 합쳐질 것이라고 믿었지 만 이것은 정확하지 않습니다. 조건은 해시이며 키 : 필드에 충돌이 있습니다. 루비는 자동으로 마지막 값을 사용합니다.

Mongoid http://mongoid.org/en/origin/docs/selection.html에서 문서를 검토하고 적절한 '와'를 사용하려면 #와 #를 사용하십시오. 쿼리를 # 조사하고 반환 된 Criteria 객체를 검사 할 수 있습니다. 예 :

puts Table.where(:field => {"$exists" => true}, :field => {"$ne" => ""}).inspect 

희망이 있습니다.

+0

대단히 감사합니다. – xaxa

+0

기꺼이 도와 드리겠습니다. 레일스 로그를 검사하여 MongoDB/Moped가 MongoDB로 보낸 쿼리를 볼 수도 있습니다. –