猫鼬按数组排序日期

时间:2016-03-21 17:06:25

标签: node.js mongodb sorting mongoose

我有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对象中的日期。

1 个答案:

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