2016-03-21 137 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 } ] }