2016-03-21 6 views
0

私はmessagesの配列を持つChatモデルを持っています。これはMessage10です。各Messageには、dateSentプロパティとプロパティの両方があります。 Messageの項目は、に埋め込まれており、ではありません。mongoose配列からの日付で並べ替え

は、どのように最新のによってIソートChat sがdateSentで最初にしてMessagedateViewedすなわち、空)を閲覧することはできませんか? (Chatusers配列を持っていることに注意してください)

これは私がこれまで試したものです(... Facebookのメッセンジャーの行動を考える):

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

上記のように、動作するようには思えませんChatは別の順序で出てきます(sort()なしと同じです)。何かご意見は?

EDIT:提案答え私はmessage配列でMessageオブジェクトをソートしたくないので、私を助けるのではなく、クエリの結果を並べ替えるChatsMessageオブジェクトこれらの日付によってませんでした配列messagesを保持します。

+1

私はどのように 'メッセージわからないんだけど.dateViewd:-1'が解釈されているので、引用符を追加することをお勧めします。すべてがうまくいくことを確認してください:) –

+0

@AndreyPopovはい、私は"{" messages.dateViewed ":-1、" messages.dateSent ":-1}'に変更しましたが、まだ動作しません... – Joum

+0

[Mongodb:配列オブジェクトによるドキュメントのソート] (http://stackoverflow.com/questions/5315658/mongodb-sort-documents-by-array-objects) – TomG

答えて

0

必要な並べ替えを行うには、集約パイプラインを使用する必要があります。

チャット/メッセージ:

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

所与の基準によってデータをソートするためのコード:

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

結果:

{ "_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 } ] } 
関連する問題