Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/meteor/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
MongoDB:按关联函数排序_Mongodb_Meteor_Nosql - Fatal编程技术网

MongoDB:按关联函数排序

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

我想创建一个由mongodb和meteor中的相关性决定的基本排序算法。但是,我不能静态存储并更新它,因为它使用当前时间作为参数之一

理想情况下,我想要的东西如下:

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>个人,根据你的模式,我认为以下方法在确定相关性方面是最常见的:

  • 在流行性方面的相关性-这就是搜索引擎如何 确定内容的相关性:一个网站的浏览量越多,它的价值就越高 更相关的是
  • 在质量方面的相关性-在您的案例中,您可以根据上/下投票率选择动态生成的算法
  • 时间相关性-您当前量化相关性的方式,使用将时间用作过滤机制的算法;不过,我不会同意这一点,因为相关内容总是有价值的
在前面提到的3种情况中,我建议您在前两种情况之间进行混合

你必须找到一个很好的方法来表示视图受欢迎度、上升票和下降票之间的关系。这意味着您首先必须更新数据库架构,以便它为每个帖子保留一个视图计数:

{
    _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);

如果您选择第二个选项,则首先必须从数据库中提取所有文档,然后在从服务器发送数据之前进行一些额外的工作以确定相关性。

如果我理解正确,您希望为每个帖子生成相关性属性,然后按相关性对信息进行排序和过滤(定量)?另外,你的数据库的模式是什么?是的,我希望人们先到主页上看看最相关的帖子,按功能排序。数据库的模式目前只有帖子、用户和评论。帖子包含
标题
链接
作者
创建数据
编辑数据
上传投票
否决票