2016-08-31 3 views
0

Ich habe eine (Nachricht) Sammlung voller Benutzer mit gelesenen und ungelesenen Nachrichten, ähnlich den unten dargestellt:Wie zähle ich die Anzahl der doppelten Felder in einem Array ohne Duplikate?

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

Ich bin in der Lage „username“ Duplikate zu beseitigen, die mich von diesem Helfer Code auszuführen:

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;} 

}); 

Helper:

<template name="messages"> 
{{#each Names}} 
    {{userName}} has {{unreadMessages}} Unread messages </br> 
{{/ each}} 
</template> 

Nachgeben dieses

Paul Otterson has 0 Unread messages 
Vincent Guily has 1 Unread messages 

Da einige der Benutzer eine bestimmte Anzahl der ungelesenen Nachrichten haben, Wie schreibe ich einen Helfer Code die Anzahl der ungelesenen Nachrichten pro Benutzer angezeigt werden? Um zu klären

würde Ich mag die unten erreichen:

Paul Otterson has 1 Unread messages 
Vincent Guily has 2 Unread messages 

Wir freuen uns auf Ihre Hilfe.

+3

_count die Menge of_ was? Bitte verwenden Sie die informativen Titel. – Tushar

+0

Vielleicht könnten Sie mit [Gruppe] tun (https://docs.mongodb.com/manual/reference/operator/aggregation/group/). Verwenden Sie das [aggregation framework] (https://docs.mongodb.com/manual/aggregation/) –

+0

: [$ group] (https://docs.mongodb.com/manual/reference/operator/aggregation/group/) nach user~~POS=TRUNC und [$ sum] (https://docs.mongodb.com/manual/reference/operator/aggregation/sum/#grp._S_sum) Unreadmessages – joao

Antwort

1

Verwenden Sie die aggregation framework, wo Sie den $group Pipeline Schritt zu Gruppen können alle Eingabedokumente durch das userName Feld und wenden den Akkumulator Ausdruck $sum zur Gruppe die Gesamt ungelesen erhalten und lesen Nachrichten zählen.

Ihre Pipeline würde wie folgt aussehen:

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

können Sie fügen die meteorhacks:aggregate package die Aggregation in Meteor zu implementieren:

zu Ihrer App hinzufügen mit

meteor add meteorhacks:aggregate 

Da diese Paket exponiert .aggregate Methode auf Mongo.Collection-Instanzen können Sie dann die Methode aufrufen, um das Ergebnisarray mit dem Dokument zu erhalten, das das Zählfeld enthält.

Verwandte Themen