2017-06-03 4 views
0

Ich freue mich, die ungelesenen Nachrichten in allen Konversationen zählen, wo ein Benutzer ein Mitglied der Konversation ist. Eine Nachricht wird von einem Benutzer gelesen, wenn sich die ID im Leser-Array befindet.Summe Subarray Länge

Folgendes gibt die Anzahl der Konversationen zurück, bei denen ungelesene Nachrichten vorhanden sind. Aber wie zählt man alle ungelesenen Nachrichten?

db.getCollection('conversations').count({ 
    'messages.readers': { $size: 1 }, //i.e. only the message author is in the message.readers array. 
    'members': { $in: [ObjectId("59320e38188c5050ac99be8f")] } 
}) 

Ich habe das Aggregat Methode überprüft, aber ich bin mir nicht sicher, ob es der richtige Ansatz ist. Folgendes gibt die Anzahl aller Nachrichten zurück.

 db.getCollection('conversations').aggregate([ 
    {$match : { 
     'members': { $in: [ObjectId("59320e38188c5050ac99be8f")] } 
    }}, 
    {$group: {_id: null, count: {$sum: {$size: "$messages"}}}}, 
]) 

enter image description here

+0

Mithilfe der Abfrage können Sie überprüfen, ob sich der Benutzer im Array 'members' und im Benutzer nicht im Array 'messages.readers' gefolgt von count befindet. Etwas wie 'db.getCollection ('Konversationen'). Count ({'Mitglieder': ObjectId (" 59320e38188c5050ac99be8f ")," messages.readers ": {$ ne: Objekt-ID (" 59320e38188c5050ac99be8f ")}})' – Veeram

+0

Natürlich, aber das zählt die Anzahl der Gespräche und nicht die Anzahl der ungelesenen Nachrichten. – nFu9DT

+0

Ich denke, ich habe diese Datenbank falsch konstruiert. – nFu9DT

Antwort

1

Sie können die unten Aggregation Pipeline versuchen.

Die folgende Abfrage wird $unwind alle Nachrichten in jedem angepassten Gespräch und Anwendung der $cond Ausdruck innerhalb von $sum Betreiber zu überprüfen, ob der Benutzer nicht in messages.readers ist und 1 zurück, wenn es eine Übereinstimmung gibt oder sonst 0 in einer $group Bühne.

db.getCollection('conversations').aggregate([ 
    {$match : {'members': ObjectId("59320e38188c5050ac99be8f") }}, 
    {$unwind : "$messages"}, 
    {$group: {_id: null, count: {$sum: {$cond: [{ $ne: ["messages.readers", ObjectId("59320e38188c5050ac99be8f")] }, 1, 0]}}}} 
]) 

Als solche $unwind ist eine teure Operation und sollte nicht über andere Optionen bevorzugt werden, aber ich glaube nicht, in Ihrem Fall ist es möglich, und $unwind folgende $match wenig besser.