2011-08-22 3 views
0

2 가지 속성에 따라 답변 집합을 검색해야합니다.몽고이 쿼리 구문 질문

# to use 
to_use=[some array of ids] 
friend_answers=Answer.any_in(:liker_ids=>to_use).map{|a|a} 
liked_answers=Answer.where(:user_id.in=>to_use).map{|a|a} 

feed_answers=(friend_answers+ liked_answers).sort{|x,y| y.created_at<=>x.created_at} 

문제는 내가 하나에 2 개 개의 쿼리를 결합하는 방법을 알고하지 않는 것입니다 : 내가하고 결국 무엇

# where liker_ids is an array and user_id is a bson in the answer document 
feed_answers=Answer.any_in(:liker_ids=>to_use,:user_id.in=>to_use).desc()map{|a|a} 

:

이 내가하고 싶은 것입니다. 다양한 조합을 시도해 왔지만 아무 것도 작동하지 않는 것 같습니다. 내 해킹 된 방법은 물론 비효율적입니다.

답변

1

당신은 (desc에 매개 변수를 누락) 수행해야합니다

Answer.any_in(:liker_ids=>to_use, :user_id.in=>to_use).desc(:created_at) 

그러나 여기 any_in가 제대로 사용되지 않는,이 상황에서 where과 유사하게 작동합니다. 당신은 아마 or를 원하는 : 그들은 기준에 응답하지 않는 방법을 발생할 때, 기준 체인의 끝에 map이 mongoid 기준이로드 게으른 것을 필요가 없습니다

Answer.or(:liker_ids=>to_use).or(:user_id.in=>to_use).desc(:created_at) 
# or 
Answer.any_of({:liker_ids=>to_use}, {:user_id.in=>to_use}).desc(:created_at) 
# or 
Answer.or({:liker_ids=>to_use}, {:user_id.in=>to_use}).desc(:created_at) 

. 또한 mongodb 커서를 활용할 수 있으므로 필요하지 않은 경우지도를 사용하지 않는 것이 좋습니다. mongodb에서 필드의 서브 세트를 검색하려면 Criteia#only 또는 Criteria#without을 사용해야합니다.

+0

Answer.Or 또는 오류 (정의되지 않은 메서드 또는 답변 : 클래스) –

+0

이 하나가 작동이 끝났습니다 감사합니다! feed_answers = Answer.any_of ({: liker_ids.in => to_use}) desc (: created_at) .skip (to_skip) .limit (per_page) –

+0

@ming 노란색 또는 일하기를 원하면'Answer.or' 또는'Answer.all.or'로 바꿔야합니다. 왜 모델을 직접 노출했는지, 또는 아직 모델에 노출되지 않았는지 잘 모르겠지만, 이미 기준이있는 경우 제대로 작동합니다. – rubish