Mongoid查询DB的虚拟属性

时间:2012-08-28 17:58:44

标签: ruby-on-rails ruby-on-rails-3 mongodb mongoid mongoid3

背景:我有帖子和用户,两者都是HABTM社区。在我的Post模型中,我有一种方法,通过比较他们共同拥有的社区数量来计算帖子与给定用户的相关性:

def relevance(user)
  (self.communities & user.communities).length
end

目标:按照给定的相关性查询帖子,即

Post.where(:relevance => 3)

查询所有帖子并按相关性对其进行排序,即

Post.all.desc(:relevance)

我知道某处需要用户变量,只是想知道这样的事情是否可行或是否存在变通方法。

1 个答案:

答案 0 :(得分:0)

您可以使用Aggregation Framework(版本2.2中的新增功能)在mongoDB中执行此操作。

您必须拥有用户社区阵列。在这个例子中我将其称为userComms - 我希望它是一个与posts.communities具有相同类型值的数组。

db.posts.aggregate( [
    {
        "$unwind" : "$communities"
    },
    {
        "$match" : {
            "communities" : {
                "$in" : userComms
            }
        }
    },
    {
        "$group" : {
            "_id" : "$_id",
            "relevance" : {
                "$sum" : 1
            }
        }
    },
    {
        "$sort" : {
            "relevance" : -1
        }
    }
]);

这将返回以下格式的文档:

{
    "result" : [
        {
            "_id" : 1,
            "relevance" : 4
        },
        {
            "_id" : 6,
            "relevance" : 3
        },
...
        ]
}

结果数组包含帖子和相关的_id,通过添加他们与用户共同的社区数量来计算。然后用它来对它进行排序(降序)。