我有Chat
模型,其中messages
数组包含Message
个。每个Message
都有dateSent
属性和dateViewed
属性。 Message
项嵌入,而非引用。
如何按最近未查看 Chat
(即空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
个对象进行排序,而是对{{Chats
数组进行排序1}}来自查询,它们在Message
数组中保存的messages
对象中的日期。
答案 0 :(得分: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 } ] }