2011-08-22 93 views
0

我需要根据2个属性检索一组答案。Mongoid查询语法问题

这就是我想要做的:

# 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} 

我最终什么事做:

# 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个查询合二为一。我一直在尝试各种组合,但似乎没有任何工作。当然我的黑客攻击方法效率很低。

回答

1

你应该做的(缺少参数desc):

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

但这里的any_in未正确使用,它的行为在这种情况下,类似于where。你可能想or

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) 

你并不需要一个map在标准链的末端,mongoid标准是懒加载,当他们遇到哪些标准不回应的方法。他们也可以利用mongodb光标,因此如果没有必要,建议不要使用map。如果您想从MongoDB中检索字段的子集,您应该使用Criteia#onlyCriteria#without

+0

Answer.or抛出一个错误(undefined method'或'for Answer:Class) –

+0

这一个结束了工作,谢谢! feed_answers = Answer.any_of({:liker_ids.in => to_use},{:user_id.in => to_use}).desc(:created_at).skip(to_skip).limit(per_page) –

+0

@ming yellow如果你想要或正在工作,您需要将'Answer.or'更改为'Answer.all.or'。我不确定为什么,但是还没有直接暴露给模型,如果你已经有了一个标准,那么效果很好。 – rubish