我有一个(消息)集合,其中包含读取和未读消息的用户,类似于下图所示:
userName READ MESSAGES unreadMessages
Paul Otterson 1 0
Vincent Guily 0 1
Paul Otterson 0 1
Vincent Guily 0 1
Paul Otterson 1 0
我能够消除“userName”重复项,这是我通过这个帮助程序代码完成的:
Template.messages.helpers({
'Names': function () {
var loggedUserName = Meteor.user().services.facebook.name;
var lastId;
var counter = 0;
var transactions = Messages.find({userName: loggedUserName}, {sort: {time: -1}}).fetch();
var users = _.uniq(transactions,true, function(messages) {return messages.userName});
users.forEach (function (row) {
counter +=1;
});
console.log(counter+ " number of users in Messages collection");
return users;}
});
助手:
<template name="messages">
{{#each Names}}
{{userName}} has {{unreadMessages}} Unread messages </br>
{{/ each}}
</template>
产生这个
Paul Otterson has 0 Unread messages
Vincent Guily has 1 Unread messages
由于某些用户具有特定数量的未读邮件,如何编写帮助程序代码以显示每个用户的未读邮件数?
澄清我想实现以下目标:
Paul Otterson has 1 Unread messages
Vincent Guily has 2 Unread messages
期待您的帮助。
答案 0 :(得分:1)
使用 aggregation framework ,您可以使用 $group
管道步骤按userName
字段对所有输入文档进行分组并将累加器表达式 $sum
应用于该组,以获取未读和已读消息总数。
你的管道看起来像这样:
var pipeline = [
{
"$group": {
"_id": "$userName",
"readMessages": { "$sum": "$read" },
"unreadMessages": { "$sum": "$unread" }
}
},
{
"$project": {
"userName": "$_id", "_id": 0,
"unreadMessages": 1, "readMessages": 1
}
}
];
var users = Messages.aggregate(pipeline);
您可以添加 meteorhacks:aggregate package 来实现Meteor中的聚合:
使用
添加到您的应用中meteor add meteorhacks:aggregate
由于此程序包在Mongo.Collection实例上公开 .aggregate
方法,因此您可以调用该方法以使用包含count字段的文档获取结果数组。