Meteor:查找5个最新文档而不重复其中一个字段

时间:2015-03-29 05:47:24

标签: mongodb meteor

我有一个帖子集合。每个帖子都有一个帖子作为文档的一部分。

以下是帖子文档的一些伪代码:

{
  '_id':...,
  'date': date,
  'thread': 'thread name is a string',
  'message': 'whatever the person wrote',
}

我想收到最近的5个帖子,但是5个返回的帖子都不能来自同一个帖子。我希望能够解释得足够好。我该怎么做?保持反应性是首选,但并非完全必要。

更新:只是想感谢Tom的代码并指出rawCollection,非常有用。

1 个答案:

答案 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)
});

我希望这是有道理的,但只要它没有按预期工作就会大喊大叫!