【问题标题】:mongoose sort by dates from array猫鼬按数组中的日期排序
【发布时间】:2016-03-21 17:06:24
【问题描述】:

我有一个Chat 模型,它有一个messages 数组,其中包含Messages。每个Message 都有一个dateSent 属性和一个dateViewed 属性。 Message 项目是嵌入的,而不是引用的

如何按最近的未查看 Message(即空的dateViewed)对Chats 排序,然后按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
});

上述方法似乎不起作用,因为Chats 以不同的顺序出现(与没有sort() 相同)。有什么想法吗?

编辑:建议的答案对我没有帮助,因为我不想对 message 数组中的 Message 对象进行排序,而是对由查询,通过 Message 对象中的日期,它们保存在 messages 数组中。

【问题讨论】:

标签: node.js mongodb sorting mongoose


【解决方案1】:

应该使用聚合管道来实现所需的排序。

聊天/消息:

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

【讨论】:

    猜你喜欢
    • 2021-01-14
    • 1970-01-01
    • 2013-01-22
    • 2011-08-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-07-27
    相关资源
    最近更新 更多