【问题标题】:Meteor Group Collection by Field流星组按字段收集
【发布时间】:2014-02-05 22:50:15
【问题描述】:

我正在尝试返回按字段(状态)分组的集合(帖子)。我对mongo和meteor很陌生。下面的查询为我提供了按状态分组的集合,其中 # of docs 按该状态...基本上我想要同样的东西,但里面有实际的文档。

另外,我希望能够发布/订阅这个,以便他们重新更新。我正在创建一个管理仪表板,按当前状态对所有帖子进行分组。

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

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

谢谢!

【问题讨论】:

  • 那么管理仪表板需要显示所有帖子,还是需要显示帖子摘要(按状态计数)?我不清楚您是否真的需要客户端上的所有文件
  • 它需要有文件,而不是计数。

标签: meteor publish-subscribe


【解决方案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)。我还假设一个帖子有一个status 和一个message

【讨论】:

  • 如何按状态分组。我想做这样的事情:goo.gl/vqXSHi 文档被分组在每个状态标题下。
  • 您可以使用会话变量来跟踪当前状态,并使用它来过滤要显示的帖子。考虑到这一点,我重写了答案。
  • @DavidWeldon,快速安全注意事项,user.profile 字段默认是可编辑的,因此为了确保此示例安全,您需要将 isAdmin 字段保留在用户对象本身上:user.isAdmin
  • @alanning 谢谢阿德里安。我更新了示例以假设 isAdmin 在用户对象上并且仅在服务器上检查。其他读者请注意 - 您也可以使用 roles 来完成此操作。
【解决方案2】:

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

您可以使用以下示例中的观察函数更新计数,来自流星文档的relevant section

// 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);

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

【讨论】:

    猜你喜欢
    • 2014-06-20
    • 2015-07-22
    • 2018-06-22
    • 1970-01-01
    • 1970-01-01
    • 2013-06-30
    • 1970-01-01
    • 1970-01-01
    • 2017-05-23
    相关资源
    最近更新 更多