Ruby on rails 基于虚拟属性的Mongoid查询数据库
背景:我有帖子和用户,两者都是HABTM社区。在我的帖子模型中,我有一种计算帖子与给定用户相关性的方法,通过比较他们有多少共同的社区: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
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”有效。