【问题标题】:Mongoid Query Syntax QuestionMongoid 查询语法问题
【发布时间】:2011-10-31 19:51:03
【问题描述】:

我需要根据 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}

我最终做了什么:

# 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 个查询合并为一个。我一直在尝试各种组合,但似乎没有任何效果。当然,我的组合方法效率非常低。

【问题讨论】:

    标签: mongodb mongoid


    【解决方案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

    【讨论】:

    • Answer.or 抛出错误(未定义方法 `or' 用于 Answer:Class)
    • 这个终于成功了,谢谢! feed_answers=Answer.any_of({:liker_ids.in=>to_use}, {:user_id.in=>to_use}).desc(:created_at).skip(to_skip).limit(per_page)
    • @ming yellow 如果您想要 or 工作,您需要将 Answer.or 更改为 Answer.all.or。我不确定为什么,但或者没有直接为模型公开,如果你已经有一个标准,那么工作正常。
    猜你喜欢
    • 1970-01-01
    • 2011-05-15
    • 2012-10-11
    • 2013-02-22
    • 1970-01-01
    • 2023-03-30
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多