我有一个帖子集合。每个帖子都有一个帖子作为文档的一部分。
以下是帖子文档的一些伪代码:
{
'_id':...,
'date': date,
'thread': 'thread name is a string',
'message': 'whatever the person wrote',
}
我想收到最近的5个帖子,但是5个返回的帖子都不能来自同一个帖子。我希望能够解释得足够好。我该怎么做?保持反应性是首选,但并非完全必要。
更新:只是想感谢Tom的代码并指出rawCollection,非常有用。
答案 0 :(得分:1)
就像免责声明一样,我把它作为一个学习练习,所以虽然我不能评论你的效率,但它应该能得到你的结果!
MongoDB有一个distinct()函数,它返回唯一的结果,但是你不能按它返回的内容排序/限制。使用不多。
相反,我认为您必须使用MongoDB的aggregate()函数。
你无法通过Meteor本地访问aggregate(),因此MurWade建议使用包。但是,如果您正在使用Meteor 1.0.4或更高版本,则可以使用rawCollection()来访问aggregate()函数。
rawCollection()只能被称为服务器端,所以下面我的例子是一个Meteor方法,它返回五个最新的,不同的帖子的_ids。
if (Meteor.isServer) {
Meteor.methods({
recentDistinctPostIds: function() {
var rawPosts = Posts.rawCollection();
var aggregateQuery = Meteor.wrapAsync(rawPosts.aggregate, rawPosts);
return aggregateQuery([{
$group: {
_id: '$thread',
date: {$max: '$date'},
postId: {$first: '$_id'}
}},
{$sort: {date: -1}},
{$limit: 5},
]);
}
});
}
然后,您将使用回调调用方法客户端,例如
Meteor.call('recentDistinctPostIds', function(err, result) {
console.log(result)
});
我希望这是有道理的,但只要它没有按预期工作就会大喊大叫!