2016-07-12 11 views
1

Ich habe Mongo Dokument chatMessages alsWie kann man multidimensionales Array mit Bedingungen in mongodb zählen?

{ 
    "_id" : ObjectId("5784dcd9db2c60b54b8b45d3"), 
    "sender_id" : "55505ad6b5a0925f4c8b7707", 
    "receivers_id" : [ 
     "57715368db2c60e5208b4579" 
    ], 
    "messages" : [ 
     { 
      "_id" : ObjectId("5784e0fadb2c605c6d8b4578"), 
      "sender" : "57715368db2c60e5208b4579", 
      "message" : "hai", 
      "send_at" : NumberLong(1468326138), 
      "read_by" : [ 
       { 
        "user" : "55505ad6b5a0925f4c8b7707", 
        "at" : NumberLong(0) 
       } 
      ] 
     }  
    ], 
    "updated_at" : NumberLong(1468327157), 
    "created_at" : NumberLong(1468327157) 
} 

ich über ein Gesamt ungelesenen Nachrichten aus dem Dokument finden müssen. Angenommen, meine aktuelle user_id ist 55505ad6b5a0925f4c8b7707. Ich bin irgendwo stecken geblieben, um Ergebnisse zu erzielen. So helfen Sie mir Jungs

aktualisieren

$unread_messages = ChatMessages::find([ 
     'conditions' => [ 
      '$or' => [ 
       ['sender_id' => $user_id], 
       ['receivers_id' => ['$elemMatch' => ['$eq' => $user_id]]] 
      ], 
      'messages.sender' => ['$ne' => $user_id] 
     ] 
    ]); 

erste Abfrage einige Ergebnisse gezeigt haben sollte, aber ich null Wert für $or operator

+0

Können Sie uns zeigen, wo Sie stecken bleiben? – chridam

+0

@chridam können Sie die Updates sehen –

Antwort

1

Als Handbuch erhalte, die Sie nicht brauchen conditions bevor. Zum Beispiel in mongo shell:

db.chats.find(
       {$or:[ 
        {'sender_id': "55505ad6b5a0925f4c8b7707"}, 
        {'receivers_id':{ $elemMatch:{ $eq:"55505ad6b5a0925f4c8b7707" } } } 
        ], 
       'messages.sender':{ $ne:"55505ad6b5a0925f4c8b7707" } 
       } 
) 

könnten Sie nutzen aggregation pipeline mit Kombination von $match, $unwind und $sum. Zum Beispiel zum Abgleichen und Abwickeln:

db.chats.aggregate([ 
        {$match: 
         {$or:[ 
          {'sender_id': 1}, 
          {'receivers_id':{ 
             $elemMatch:{$eq:1}}}], 'messages.sender':{$ne:1}}}, 
       {$unwind:"$messages"}, 
       {$unwind:"$messages.read_by"} 
]) 

Sobald Sie das Ergebnis haben, können Sie gruppieren und entsprechend addieren. (Ihr Beispiel zeigt leider nicht, wie ungelesen wurde, und es gibt nur 1 Nachricht)

Nachdem das gesagt wurde, müssen Sie Ihre data models erneut in Betracht ziehen. Wenn Nachrichten in einem eingebetteten Dokument gespeichert werden, können Sie die BSON document size limit of 16MB erreichen, sobald Sie viele Nachrichten haben. Ihr aktuelles Modell ist möglicherweise für kleine Chats geeignet, wird aber nicht gut skalieren. Weitere Informationen finden Sie unter Data Model Examples and Patterns.

+0

Ich werde Datenmodelle überdenken –

Verwandte Themen