gpt4 book ai didi

node.js - 对 mongoose mapReduce 进行分页,用于排名算法

转载 作者:太空宇宙 更新时间:2023-11-03 23:32:24 24 4
gpt4 key购买 nike

我正在使用 MongoDB mapReduce 来编写排名提要算法,它几乎可以工作,但最新要实现的是分页。 map 缩减支持结果限制,但我如何实现基于偏移(跳过)的例如根据最新查看的结果 _id,知道我正在使用 mongoose?

这是我写的程序:

o = {};

o.map = function() {
//log10(likes+comments) / elapsed hours from the post creation
emit(Math.log(this.likes + this.comments + 1) / Math.LN10 / Math.abs((now - this.createdAt) / 6e7 + 1), this);
};

o.reduce = function(key, values) {
//sort the values, when they have the same score
values.sort(function(a, b) {
a.createdAt - b.createdAt;
});

//serialize the values, because mongoose does not support multiple returned values
return JSON.stringify(values);
};

o.scope = {now: new Date()};
o.limit = 15;

Posts.mapReduce(o, function(err, results) {
if (err) return console.log(err);
console.log(results);
});

另外,如果 mapReduce 不是可行的方法,您是否建议其他人如何实现这样的事情?

最佳答案

你需要的是一个页面分隔符,它不是你所说的最新查看的id,而是你的排序属性。在这种情况下,似乎是公式 Math.log(this.likes + this.comments + 1) / Math.LN10 / Math.abs((now - this.createdAt) / 6e7 + 1) .

所以,在你的mapReduce query中需要持有where上面那个公式的值。或者具体来说,'公式 >= . And also it needs to hold the value of createdAt at the last page, since you don't sort by that. (Assuming createdAt is unique). So your查询of mapReduce would say其中:FormulaExpression,createdAt:{ $lt:lastCreatedAt }`

如果您确实允许多个相同的createdAt值,则必须在数据库本身之外进行一些操作。

所以你只需按公式搜索即可。

理想情况下,这会为您提供一个具有完全相同值的元素,并在该值之后排序下一个元素。因此,为了回复模块调用者,请从数组中删除第一个元素(并确保您实际上要求的结果比您需要的结果更多)。

现在,由于您允许使用多个相似的值,因此您需要另一个标识属性,例如对象 id 或created_at。您的消费者(此模块的调用者)必须提供两者( last value of the scorecreatedAt of the last object )。假设您有一个页面恰好在中间分割 - 一个或多个对象位于上一页,另一组位于下一页。您不仅必须删除顶部的值(因为上一页上已经提供了相同的分数),而且可能需要删除顶部的其中几个值。

然后它就会变得真的疯狂,因为您的整个页面可能已经被提供 - 比较 _ids,在模块调用者为您提供的 _ids 之后查找第一个。或者查看数据并确定有多少个这样的匹配值,尝试从 mapReduce 中获取至少与实际页面大小一样多的值。

除此之外,我会用聚合来完成此操作,它应该更加有效。

关于node.js - 对 mongoose mapReduce 进行分页,用于排名算法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36665983/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com