MongoDB:按关联函数排序
我想创建一个由mongodb和meteor中的相关性决定的基本排序算法。但是,我不能静态存储并更新它,因为它使用当前时间作为参数之一 理想情况下,我想要的东西如下:MongoDB:按关联函数排序,mongodb,meteor,nosql,Mongodb,Meteor,Nosql,我想创建一个由mongodb和meteor中的相关性决定的基本排序算法。但是,我不能静态存储并更新它,因为它使用当前时间作为参数之一 理想情况下,我想要的东西如下: Post.relevance = function(magnitude) { magnitude = magnitude || 1.8; check(magnitude, Number); var score = this.upvotes - this.downvotes; var hoursAgo = moment
Post.relevance = function(magnitude) {
magnitude = magnitude || 1.8;
check(magnitude, Number);
var score = this.upvotes - this.downvotes;
var hoursAgo = moment().hours - moment(this.createdAt).hours();
return (score - 1) / Math.pow((hoursAgo + 2), magnitude);
}
从我收集的信息来看,我将不得不使用来生成这个查询,但是我不能完全获得我的帖子页面的详细信息
如何使用mongodb生成此高级查询?该算法取决于您如何定义相关性 在继续之前,我想提一下,我以前没有在生产环境中实现过这样的算法,我只是就如何解决这个问题发表了我个人的看法 P>个人,根据你的模式,我认为以下方法在确定相关性方面是最常见的:
- 在流行性方面的相关性-这就是搜索引擎如何 确定内容的相关性:一个网站的浏览量越多,它的价值就越高 更相关的是
- 在质量方面的相关性-在您的案例中,您可以根据上/下投票率选择动态生成的算法
- 时间相关性-您当前量化相关性的方式,使用将时间用作过滤机制的算法;不过,我不会同意这一点,因为相关内容总是有价值的
{
_id: ObjectId(...),
title: 'A Random Post',
authorId: ObjectId(...),
createdAt: '01-01-1900',
editedAt: '02-01-1900',
upvotes: 76,
downvotes: 15,
viewCount: 8655,
relevance:
}
然后,您可以确定计算相关性的公式。例如,如果假设一篇文章获得的视图越多,它就越受欢迎,则可以使用以下公式:
Relevance = viewCount * upvotes/downvotes
不过,最重要的部分是如何选择存储相关性属性
在我看来,您有两种可能的选择:
- 将其与所有其他元素一起存储在数据库中-此
这意味着您必须不断更新每一项的相关性
post,同时持续发布viewCount的
更新, 赞成票和反对票$inc
- 在查询仅数据库问题后确定相关性
更新视图计数、向上投票和向下投票;拉后 从数据库中获取数据时,必须解析结果 数组并量化相关性,而无需将其存储在数据库中$inc
//Top 10 most relevant posts
db.posts.find({}).sort({ relevance: -1 }).limit(10);
如果您选择第二个选项,则首先必须从数据库中提取所有文档,然后在从服务器发送数据之前进行一些额外的工作以确定相关性。如果我理解正确,您希望为每个帖子生成相关性属性,然后按相关性对信息进行排序和过滤(定量)?另外,你的数据库的模式是什么?是的,我希望人们先到主页上看看最相关的帖子,按功能排序。数据库的模式目前只有帖子、用户和评论。帖子包含
标题,链接,作者,创建数据,编辑数据,上传投票
和否决票