这是关于评论的喜欢和不喜欢。我想通过相似性对评论进行排序,因此首先会出现更多喜欢的评论。问题是,不喜欢的评论出现在评论之前,而不是不喜欢。
我想要的是什么:
我实际上得到了什么:
我对我的流星助手的mongo查询:
Missatges.find({ topic: 'xxx' }, { sort: { like:{ $size: -1}, dislike:{ $size: 1}, date: -1 } }).fetch();
请注意,我使用$ size,因为喜欢和不喜欢是用户_id的数组。 这是我的评论架构:
author: {
type: String
},
authorId: {
type: SimpleSchema.RegEx.Id
}
isAnswer: {
type: Boolean
},
parentId: {
type: SimpleSchema.RegEx.Id,
optional: true
},
date: {
type: Date
},
topic: {
type: String
},
likes: {
type: [SimpleSchema.RegEx.Id]
},
dislikes: {
type: [SimpleSchema.RegEx.Id]
},
answers: {
type: [SimpleSchema.RegEx.Id],
optional: true
},
text: {
type: String,
max: 900,
}
答案 0 :(得分:1)
根据this question的回答,您无法使用$size
对mongo进行排序。一种解决方案是fetch
匹配文档,并在帮助程序中sort
。这是一个例子(注意这是未经测试的,可能需要一些调整):
Template.something.helpers({
sortedThings: function () {
return Missatges
.find({ topic: 'xxx' })
.fetch()
.sort(function (b, a) {
var al = a.likes.length;
var ad = a.dislikes.length;
var bl = a.likes.length;
var bd = a.dislikes.length;
var d1 = a.date;
var d2 = b.date;
// compare by likes
if (al > bl) return 1;
if (al < bl) return -1;
// compare by dislikes
if (ad < bd) return 1;
if (ad > bd) return -1;
// compare by date
if (d1 > d2) return 1;
if (d1 < d2) return -1;
// they are equal
return 0;
});
},
});