按现场划分的流星集团

时间:2014-02-05 22:50:16

标签: meteor publish-subscribe

我正在尝试返回按字段(状态)分组的集合(过帐)。我对mongo和meteor很新。下面的查询为我提供了按状态分组的集合,其中包含该状态的文档数...基本上我想要相同的东西,但在那里有实际的文档。

此外,我希望能够发布/订阅它,以便它们重新激活。我正在创建一个管理仪表板,按当前状态对所有过帐进行分组。

一位朋友提供了以下要点,但有点过头了:https://gist.github.com/ryw/8827179

db.postings.group({ key: {status: 1}, initial: {sum:0}, reduce: function(doc, prev) { prev.sum += 1; } })

谢谢!

2 个答案:

答案 0 :(得分:1)

如果您需要客户端上的所有文档,那么我只需发布整个集合并让模板代码对它们进行分组。

客户端

Tracker.autorun(function() {
  if (Meteor.user()) {
    Meteor.subscribe('allPostings');
  }
});

Template.admin.helpers({
  postings: function() {
    if (Session.get('currentStatus')) {
      return Postings.find({status: Session.get('currentStatus')});
    }
  },
  statuses: function() {
    return _.uniq(_.pluck(Postings.find().fetch(), 'status'));
  }
});

Template.admin.events({
  'click .status': function() {
    Session.set('currentStatus', String(this));
  }
});
<template name="admin">
  <div class="left-panel">
    <ul>
      {{#each statuses}}
      <li class="status">{{this}}</li>
      {{/each}}
    </ul>
  </div>
  <div class="right-panel">
    <ul>
      {{#each postings}}
      <li>{{message}}</li>
      {{/each}}
    </ul>
  </div>
</template>

服务器

Meteor.publish('allPostings', function() {
  var user = Meteor.users.findOne(this.userId);
  if (user.isAdmin) {
    return Postings.find();
  }
});

我假设你有办法识别管理员用户(这里我用isAdmin)。我还假设帖子有statusmessage

答案 1 :(得分:0)

您可以对数据进行非规范化处理,并存储单独的组及其计数集合,而不是使用聚合函数或map reduce操作。

您可以使用观察函数更新您的计数,如以下示例中的relevant section meteor docs所示:

// Keep track of how many administrators are online.
var count = 0;
var query = Users.find({admin: true, onlineNow: true});
var handle = query.observeChanges({
  added: function (id, user) {
    count++;
    console.log(user.name + " brings the total to " + count + " admins.");
  },
  removed: function () {
    count--;
    console.log("Lost one. We're now down to " + count + " admins.");
  }
});

// After five seconds, stop keeping the count.
setTimeout(function () {handle.stop();}, 5000);

这样,您可以在模板上显示组及其计数,这将是被动的。