我正在尝试返回按字段(状态)分组的集合(过帐)。我对mongo和meteor很新。下面的查询为我提供了按状态分组的集合,其中包含该状态的文档数...基本上我想要相同的东西,但在那里有实际的文档。
此外,我希望能够发布/订阅它,以便它们重新激活。我正在创建一个管理仪表板,按当前状态对所有过帐进行分组。
一位朋友提供了以下要点,但有点过头了:https://gist.github.com/ryw/8827179
db.postings.group({ key: {status: 1}, initial: {sum:0}, reduce: function(doc, prev) { prev.sum += 1; } })
谢谢!
答案 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
)。我还假设帖子有status
和message
。
答案 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);
这样,您可以在模板上显示组及其计数,这将是被动的。