【问题标题】:How do I count the number duplicate fields in a non duplicate array?如何计算非重复数组中重复字段的数量?
【发布时间】:2017-01-08 02:26:21
【问题描述】:

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

userName               READ MESSAGES     unreadMessages
Paul Otterson             1                0
Vincent Guily             0                1   
Paul Otterson             0                1
Vincent Guily             0                1 
Paul Otterson             1                0

我能够消除“用户名”重复项,这是我通过此帮助代码完成的:

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

期待您的帮助。

【问题讨论】:

  • 数一数什么?请使用信息性标题。
  • 也许你可以使用group
  • 使用aggregation framework: $group by userName 和$sum unreadMessages
  • @Joao 感谢您指出我的方向。您介意在代码中演示如何实现这一点吗?
  • 我认为这是一个非常简单的解决方案,不需要聚合。请粘贴您的“消息”架构以及如何保存阅读消息的人。

标签: javascript mongodb meteor foreach


【解决方案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 字段的文档的结果数组。

【讨论】:

    猜你喜欢
    • 2012-01-31
    • 1970-01-01
    • 2020-05-27
    • 2016-03-07
    • 2013-08-20
    • 1970-01-01
    • 1970-01-01
    • 2014-12-19
    • 2020-12-01
    相关资源
    最近更新 更多