2016-03-21 9 views
0

Ich habe ein Chat Modell, das eine messages Array hat, die Message s hält. Jede Message hat sowohl eine dateSent Eigenschaft als auch eine dateViewed Eigenschaft. Die Message Artikel sind eingebettet, nicht verwiesen.Mungo sortieren nach Daten von Array

Wie kann ich irgendwie Chat s nach jüngsten nicht gesehenMessage (dh leer dateViewed) und dann durch dateSent? (Man denke an Facebook Messenger Verhalten ...)

Dies ist, was ich bisher versucht (beachten Sie, dass Chat auch eine users Array):

Chat.find({users._id: userId}).sort({messages.dateViewed: -1, messages.dateSent: -1}).exec(function(err, chats){ 
    // handle err 
    // handle no docs found 
    // handle docs found 
}); 

Die oben nicht zu funktionieren scheint, wie die Chat s kommen in einer anderen Reihenfolge heraus (das gleiche wie ohne sort()). Irgendwelche Gedanken?

EDIT: Die vorgeschlagene Antwort half mir nicht, weil ich will nicht die Message Objekte in der message Array sortieren, sondern die Chats aus der Abfrage, durch die in dem Message Objekt resultierenden sortiert sie Halten Sie in einem messages Array.

+1

Ich bin nicht sicher, wie 'Nachrichten .dateViewd: -1' wird interpretiert, ich würde vorschlagen, zumindest Zitate hinzuzufügen, nur um sicher zu gehen, dass alles in Ordnung ist :) –

+0

@AndreyPopov Ja, ich habe es in '{" messages.dateViewed ": -1," messages.dateSent ": -1}' geändert, funktioniert aber immer noch nicht ... – Joum

+0

Mögliche Duplikate von [Mongodb: Dokumente nach Array-Objekten sortieren] (http://stackoverflow.com/questions/5315658/mongodb-sort-documents-by-array-objects) – TomG

Antwort

0

Die Aggregationspipeline sollte verwendet werden, um die erforderliche Sortierung zu erreichen.

Chats/messages:

> db.chats.find() 
{ "_id" : "c1", "messages" : [ { "_id" : "m1_1", "dv" : -1, "ds" : 9000 }, { "_id" : "m1_2", "dv" : 8010, "ds" : 8000 } ] } 
{ "_id" : "c2", "messages" : [ { "_id" : "m2_1", "dv" : -1, "ds" : 11000 } ] } 
{ "_id" : "c3", "messages" : [ { "_id" : "m3_1", "dv" : -1, "ds" : 700 }, { "_id" : "m3_2", "dv" : 7010, "ds" : 7000 } ] } 

Der Code der Daten durch den give Kriterien zu sortieren:

db.chats.aggregate([ 
{ $unwind: '$messages' }, 
{ $addFields: { 
     ts: { 
      $cond: [ 
       { $eq: ['$messages.dv', -1 ] }, 
       '$messages.ds', 
       '$messages.dv'] 
     } 
    } 
}, 
{ 
    $sort: { 'ts': -1 } 
}, 
{  
    $group: { 
     _id: '$_id', 
     ts: { $max: '$ts'}, 
     messages: { $push: '$messages' }  
    } 
}, 
{ 
    $sort: {ts: -1} 
}]); 

Die Ergebnisse:

{ "_id" : "c2", "ts" : 11000, "messages" : [ { "_id" : "m2_1", "dv" : -1, "ds" : 11000 } ] } 
{ "_id" : "c1", "ts" : 9000, "messages" : [ { "_id" : "m1_1", "dv" : -1, "ds" : 9000 }, { "_id" : "m1_2", "dv" : 8010, "ds" : 8000 } ] } 
{ "_id" : "c3", "ts" : 7010, "messages" : [ { "_id" : "m3_2", "dv" : 7010, "ds" : 7000 }, { "_id" : "m3_1", "dv" : -1, "ds" : 700 } ] } 
Verwandte Themen