2013-08-30 2 views
0

기준 및 #find를 이해하는 데 문제가 있습니다. 기준몽고 이드 : 기준 #find - 기준에서 결과를 찾기 위해 어떻게 제한합니까?

def returns_criteria 
    MyModel.in(...) 
end 

나의 이해는 당신이 일을 체인으로 결과가 더 제한받을 것이 었습니다 :

나는 보이는 코드의 비트. 그것은 저의 오해의 소지가있는 관계 컬렉션이 어떻게 작용하는지 보여줍니다.

returns_criteria.find(some_id) 

그때는 MyModel.in 호출에 의해 발견 된 결과 내 아이디 SOME_ID 가진 개체를 찾을 것입니다 :

그래서 내 기대는 내가 전화하면이었다. 그러나 이것은 일어나지 않습니다. 마치 MyModel에서 호출되는 것처럼 #find가 호출되는 것 같습니다.

이 #find를 현재 지정된 기준의 결과로 제한하고 싶습니다. 어떻게 든 할 수 있을까요?

최소 생식 환매 약정은 : 실행 in.rb의 https://github.com/nchelluri/mongoid-in-find

출력 : https://gist.github.com/nchelluri/6401850

+0

Mongoid 3을 사용하여 문제를 재현 할 수 없습니다. 몇 가지 세부 정보를 제공해 주실 수 있습니까? 아마도 당신은'any_of'에 전달할 해시의 예제일까요? –

+0

나는 최소한의 복제 사례를 작성하려고 시도했으나 오류가 발생하지 않았 음을 발견했습니다. 아마도 내가 뭔가 다른 일을하고있어 ... –

+0

내가 사용하고있는 것으로 밝혀졌다. : :, 안 : : any_of. 재현 할 수 있었고 질문을 업데이트했습니다. –

답변

1

내가 여기에 무슨 일이 일어나고 있는지 발견했습니다 생각합니다. 당신이 오토바이는 $stdout에 로그인 할 때 직접하는 경우가 데이터베이스에 전송 무슨 명령에 대해 자세히 살펴 수행 할 수 있습니다

Moped.logger = Logger.new($stdout) 
Moped.logger.level = Logger::DEBUG 

원래 in 기준에 대한 선택기 해시 개체 것은 :

selector={"_id"=>{"$in"=>["5222b8edf273e6eeb1000001", "5222b8edf273e6eeb1000002"]} 

그러나 경우 당신이 체인에 '찾기'를하면 다음과 같이됩니다.

selector={"_id"=>"5222b8edf273e6eeb1000003"} 

... 기본적으로 Ruby 해시의 표준 동작 결과입니다. 원래 in 선택자의 "_id" 키를 find의 키로 재 할당했습니다. 이것은 단지 Mongoid/Moped의 한계 일 수 있습니다. 그리고 나는 당신이 그것을 어떻게 해결할 지 확신하지 못합니다. 동시에 을 여러 번 검색해야하는 경우를 찾기 위해 고심하고 있지만 테스트 사례로는 반 직관이 아닙니다.

+0

'selector = { "_ id"=> "52260b0073197f08c8000003", "$ and"=> [{{ "_ id"=> "52260b0073197f08c8000003"}]}}하지만 그렇지 않으면 동의합니다. ': id'로'MyModel :: in' 대신': id.in'과 함께'MyModel :: any_of'를 사용하면 원하는 결과를 얻는 것처럼 보입니다. 도와 줘서 고마워! –

+0

BTW, :: any_of가있는 선택자는 다음과 같습니다 :'selector = { "$ or"=> { "$ in"=> [ "52260ba473197f5329000001", "52260ba473197f5329000002"]}}], "_id "=>"52260ba473197f5329000003 "}'. –