gpt4 book ai didi

javascript - Meteor - 发布按个性化分数排序的集合

转载 作者:数据小太阳 更新时间:2023-10-29 03:57:47 25 4
gpt4 key购买 nike

我想发布一个集合,其中根据文档的字段和用户确定的上下文的组合对文档进行评分;并且返回的结果是根据这个分数排序的,并且可能仅限于最前面的结果。

This显示如何在发布时对集合添加 transform 过滤器。但是,我不确定 transform 是否是计算我想在排序中使用的字段的有效方法。

最后,如果使用 Mongo map reduce 根据计算的分数快速返回推荐项目,这将是非常棒的,这可以并行完成。

@brett-mclain pointed out如何在纯 Mongo 中完成一些 map reduce 排序。有几个Meteor包裹out there扩展 Meteor 集合,但我找不到如何在 Meteor 出版物中使用它们(与方法相比)此外,here map reduce 输出被发送到另一个集合,该集合显然在每次调用该方法时都被覆盖。

这里大概是我想实现的逻辑:

/* Server */
Meteor.publish('getRecommendedItems', function() {
var u = Users.findOne(this.userId);
var scoreItem = function(item, u) { ... };
return Items.find(
{},
{
transformInParallel: function(doc) {
doc.score = scoreItem(doc);
},
sort: {score: -1},
limit: 10,
}
);
});


/* Client template*/
Template.templateName.onCreated(function() {
this.subscribe('getRecommendedItems');
this.items = Items.find({}, sort: {score: -1});
});

除了 score 可以在客户端访问而无需在那里进行任何计算。

Meteor.methods 中做自定义事情似乎更容易,但是 Meteor.publish 感觉更像是做这件事的自然场所;因为它是 Meteor 神奇 react 发生的地方。

最佳答案

  transformInParallel: function(doc) {
doc.score = scoreItem(doc);
},
sort: {score: -1},
limit: 10,

这将导致全数据库扫描。

时间衰减解决方案实际上是常见的编程测试问题,并不真正适合您的用例。

如果你的规模很小,只需预先计算一整套

{score: ..., userId: ..., item: ...}

单独集合中的文档。像这样的 10 亿个小文档的索引将完全适合单个数据库服务器的 RAM;这最多适用于例如30,000 个项目和 30,000 个用户。

如果您的需求超出此范围,则必须考虑可以在用户之间共享分数计算的哪一部分。如果无法共享计算的任何部分,您应该阅读有关 Facebook 如何在传统数据库上实现社交图的信息。

关于javascript - Meteor - 发布按个性化分数排序的集合,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35046576/

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