我有这个产品系列,我希望根据自定义排序功能显示top 10 products
[{ _id: 1, title, tags:['a'], createdAt:ISODate("2016-01-28T00:00:00Z") } ,
{ _id: 2, title, tags:['d','a','e'], createdAt:ISODate("2016-01-24T00:00:00Z") }]
我想要做的是根据可以计算的“魔术得分”对其进行排序。例如,基于以下公式:tag_count*5 - number_of_days_since_it_was_created
。
如果第一个是1天,则得分:
[{_id:1 , score: 4}, {_id:2, score: 10}]
我对如何实现这一点有一些想法,但我不确定它们有多好,特别是因为我对mongo和流星都不熟悉:
启动观察者(Meteor.observe)并且每次都有文档 修改(或创建一个新的),重新计算分数并更新它 关于集合本身。如果我这样做,我可以使用$ orderBy 我需要的地方。
经过一番阅读后我发现mongo聚合或map_reduce 可以帮助我实现相同的结果,但据我所知, meteor不直接支持
将客户端的集合排序为数组,但使用此方法 方法我不确定它将如何表现与分页(考虑到我订阅了有限数量的文件)
感谢您提供与我分享的任何信息!
答案 0 :(得分:7)
文字函数排序is just being implemented in meteor,因此您应该可以执行类似
的操作Products.find({}, {sort: scoreComparator});
即将发布的。
您可以使用transform property when creating collection。在此变换中,将魔术操作存储为函数。
score=function(){
// return some score
};
transformer=function(product){
product.score=score;
// one could also use prototypal inheritance
};
Products=new Meteor.Collection('products',{transform:transformer});
不幸的是you cannot yet use the sort operator on virtual fields,因为minimongo不支持它。
因此,您提到的最终回落也不是虚拟字段排序,也不是在minimongo中支持文字功能排序是客户端排序:
// Later, within some template
scoreComparator=function(prd1,prd2){
return prd1.score()-prd2.score();
}
Template.myTemplate.helpers({
products:function(){
return Products.find().fetch().sort(scoreComparator);
}
});
我不确定它会如何与分页表现(考虑到我订阅了有限数量的文件)
编辑:确实会在订阅的文档中计算得分。