背景:我有帖子和用户,两者都是HABTM社区。在我的Post模型中,我有一种方法,通过比较他们共同拥有的社区数量来计算帖子与给定用户的相关性:
def relevance(user)
(self.communities & user.communities).length
end
目标:按照给定的相关性查询帖子,即
Post.where(:relevance => 3)
或
查询所有帖子并按相关性对其进行排序,即
Post.all.desc(:relevance)
我知道某处需要用户变量,只是想知道这样的事情是否可行或是否存在变通方法。
答案 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,通过添加他们与用户共同的社区数量来计算。然后用它来对它进行排序(降序)。