Ruby on rails 基于虚拟属性的Mongoid查询数据库

Ruby on rails 基于虚拟属性的Mongoid查询数据库,ruby-on-rails,ruby-on-rails-3,mongodb,mongoid,mongoid3,Ruby On Rails,Ruby On Rails 3,Mongodb,Mongoid,Mongoid3,背景:我有帖子和用户,两者都是HABTM社区。在我的帖子模型中,我有一种计算帖子与给定用户相关性的方法,通过比较他们有多少共同的社区: def relevance(user) (self.communities & user.communities).length end 目标:根据给定的相关性,即 Post.where(:relevance => 3) Post.all.desc(:relevance) 或 查询所有帖子并按相关性排序,即 Post.where(:rel

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

def relevance(user)
  (self.communities & user.communities).length
end
目标:根据给定的相关性,即

Post.where(:relevance => 3)
Post.all.desc(:relevance)

查询所有帖子并按相关性排序,即

Post.where(:relevance => 3)
Post.all.desc(:relevance)

我知道在某些地方需要用户变量,只是想知道这样做是否可行,或者是否存在解决方法。

您可以在mongoDB中使用(2.2版中的新版本)来实现这一点

您必须拥有可用的用户社区阵列。在本例中,我将其称为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,计算方法是将它们与用户共有的社区数量相加。然后按该总和排序(降序)。

我担心您不能直接这样做。但是你可以使用一些map/reduce处理。你能扩展一点吗?我不确定你到底想实现什么。相关性是在哪里计算的?文档中是否已经存在相关性?相关性是作为post.rb中的一种方法计算的(见上面的代码),因为每个用户的相关性不同,必须动态计算。啊,好的,所以您可以滚动每个post分配此函数,现在您想按该函数排序。我相信MongoDB在其驱动程序中并不支持这一点,因此您可能需要找到一个可以为您实现这一点的函数,可能是ruby中的快速排序函数。我个人不知道有一个,因为我不是一个ruby程序员。刚开始使用Mongo,我一直在寻找如何使用Mongoid实现它——尽管我不确定它是否可行。关于:使用Mongoid执行此操作有什么建议吗?您可以使用db.runCommand({aggregate:“collectionname”,pipeline:[…])来执行任何聚合框架pipelineThank,这种方法存在的问题是,帖子的相关性对于每个用户都是不同的。这意味着它需要当前用户对象才能进行计算。关于如何做到这一点有什么想法吗?这就是我的示例中“userComms”所代表的。将用户的社区读入数组,并将其用作此查询的参数,响应将仅对该用户有效,并且仅对“now”有效。