【问题标题】:Mongoose find last messages grouping by two fieldsMongoose 查找按两个字段分组的最后一条消息
【发布时间】:2017-03-22 20:40:14
【问题描述】:

我想根据联系人最近发送或接收的消息整理一个联系人列表。 为此,我必须对最后一条消息(发送和接收)进行排序,添加它们并返回最后一条。

我的回复应采用以下格式:

{
  "success": true,
  "chatlist": [
    {
      "id_user": "54228fe2c0df8d1120ed091b",
      "lastMessage": {
        "content": "message 6",
        "date": "2016-11-09T02:54:41.687Z"
      },
      "unreadMessages": 3,
      "name": "user 1"
    },
    {
      "id_user": "12228fe2c0df8d11204g4d",
      "lastMessage": {
        "content": "message 3",
        "date": "2016-11-09T02:54:23.329Z"
      },
      "unreadMessages": 2,
      "name": "user 2"
    },
    {
      "id_user": "58228fe2c0df8d1120e12sd",
      "lastMessage": {
        "content": "message 1",
        "date": "2016-11-09T02:54:19.313Z"
      },
      "unreadMessages": 1,
      "name": "user 3"
    }
  ],
  "pages": 2
}

我的用户架构是:

var schema = new Schema({
    name: {type: String, required: true},
    email: {type: String, required: true, unique: true},
    password: {type: String, required: true, select: false},
    created_at: {type: Date, required: true, default: Date.now}
});

我的消息架构是:

var schema = new Schema({
    content: {type: String, required: true},
    type: {type: String, required: true, default: 'text'},
    status: {type: String, default: 'not_read'},
    created_at: {type: Date, default: Date.now},
    read_at: {type: Date},
    userFrom: {type: Schema.Types.ObjectId, ref: 'User', required: true},
    userTo: {type: Schema.Types.ObjectId, ref: 'User', required: true}
});

我试过这个:

var itensPerPage = 15;
var skip = page !== undefined ? page * itensPerPage : 0;
pages = Math.ceil(pages / itensPerPage);

Message
.aggregate([
    { '$sort': { 
        'created_at': -1 
    }},
    { "$skip": skip },
    { "$limit": itensPerPage },
    { '$match': { 
        $or: [
            { userFrom: user.id_user }, 
            { userTo: user.id_user }
        ] 
    }},
    { '$group': { 
            '_id': {
                'userFrom': '$userFrom', 
                'userTo': '$userTo'
            },
        }
    },
])
.exec(function (err, messages) {
    res.send({"success": true, "chatlist": messages, "pages": pages});
});

如何修改我的查询以获得所需的响应? 谢谢。

【问题讨论】:

    标签: node.js mongodb mongoose mongodb-query aggregation-framework


    【解决方案1】:

    试试这个

    var itensPerPage = 15;
    var skip = page !== undefined ? page * itensPerPage : 0;
    pages = Math.ceil(pages / itensPerPage);
    
    Message
    .aggregate([
        { '$sort': { 
            'created_at': -1 
        }},
        { "$skip": skip },
        { "$limit": itensPerPage },
        { '$match': { 
            $or: [
                { userFrom: user.id_user }, 
                { userTo: user.id_user }
            ] 
        }},
    {$unwind : $chatlist},
    {$sort : {chatlist.date : -1}},
    {$group : {_id : $_id},chatlist : {$push : $chatlist}},   
    ])
    .exec(function (err, messages) {
        res.send({"success": true, "chatlist": messages, "pages": pages});
    });
    

    【讨论】:

    • 我收到错误:“错误:参数必须是聚合管道运算符”
    猜你喜欢
    • 1970-01-01
    • 2018-02-03
    • 2023-03-14
    • 2018-09-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多