2016-03-21 181 views
0

我有一個Chat模型,它有一個messages陣列,其中包含Message s。每個Message都有一個dateSent屬性和一個dateViewed屬性。 Message項目是嵌入式,而不是參考貓鼬按陣列日期排序

我如何排序Chat S按最近不看Message(即空dateViewed),然後再通過dateSent? (認爲​​Facebook Messenger的行爲...)

這是我到目前爲止已經試過(注意:Chat也有users陣列):

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()的相同)。有什麼想法嗎?

編輯:建議的答案並沒有幫助我,因爲我不想給message數組中Message對象進行排序,而是在Message對象排序Chats從查詢產生的,由他們日期持有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

應該使用Aggregation管道來實現所需的排序。

聊天/消息:

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