如何计算非重复数组中的重复字段数?

时间:2016-08-31 13:10:22

标签: javascript mongodb meteor foreach

我有一个(消息)集合,其中包含读取和未读消息的用户,类似于下图所示:

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

期待您的帮助。

1 个答案:

答案 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字段的文档获取结果数组。