Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/40.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Node.js 查询mongoose获取每次对话的最后一条消息_Node.js_Mongodb_Mongoose - Fatal编程技术网

Node.js 查询mongoose获取每次对话的最后一条消息

Node.js 查询mongoose获取每次对话的最后一条消息,node.js,mongodb,mongoose,Node.js,Mongodb,Mongoose,我与模特聊天: var schema = mongoose.Schema({ userSend: {type: ObjectId, ref: 'User' }, userReceive: {type: ObjectId, ref: 'User' }, message : {type: 'String', require: true}, status: {type: 'Boolean', default: tru

我与模特聊天:

var schema = mongoose.Schema({
   userSend:        {type: ObjectId, ref: 'User' },
   userReceive:         {type: ObjectId, ref: 'User' },
   message :        {type: 'String', require: true},
   status:          {type: 'Boolean', default: true}, 
   time:            {type: 'Date', default: Date.now}
}); 
module.exports = mongoose.model('Chat', schema);
请!帮助我查询以获取彼此对话的最后一条消息。与facebook对话相同

这是样本数据

{_id: '156478', msg: 'Hello lam', userSend: 'ZungX', userReceive:'Lam', timestamp: '2015-10-25T18:02:41.400Z'}
{_id: '586456', msg: 'hi My', userSend: 'Duc', userReceive:'My', timestamp: '2015-10-25T19:05:00.400Z'}
{_id: '254566', msg: 'Hello Duc', userSend: 'ZungX', userReceive:'Duc', timestamp: '2015-10-26T13:06:41.400Z'} 
{_id: '456899', msg: 'hi ZungX last', userSend: 'Duc', userReceive:'ZungX', timestamp: '2015-10-26T17:02:41.400Z'}
{_id: '987556', msg: 'Hello ZungX', userSend: 'Lam', userReceive:'ZungX', timestamp: '2015-10-26T20:01:41.400Z'}
{_id: '456878', msg: 'Chao Lam', userSend: 'ZungX', userReceive:'Lam', timestamp: '2015-10-26T21:54:21.400Z'} 
现在,我想获取用户“ZungX”的对话列表

我想要这个结果:

[
    {   
        msg:        'hi ZungX last',
        withUser:   'Duc', //it's userSend
        timestamp:  '2015-10-26T17:02:41.400Z'
    },
    {
        msg:        'Chao Lam',
        withUser:   'Lam', //it's userReceive
        timestamp:  '2015-10-26T21:54:21.400Z'
    }
]
我有同样的问题,但我不明白

谢谢大家:D

“hi ZungX last”这是“ZungX”最后一条带有“Duc”的消息。注意:此消息用户“ZungX”的角色为UserReceive

“Chao Lam”是“ZungX”和“Lam”的最后一句话。注意:此消息用户“ZungX”的角色是UserSend

使用获得所需结果,如下例所示:

var pipeline = [
    {
        "$match": {
            "userReceive": "ZungX"
        }
    },
    {
        "$project": {
            "msg": 1, "withUser": "$userSend", "timestamp": 1, "_id": 0
        }
    }
]

Chat.aggregate(pipeline)
    .exec(function(err, results){
        // handle err
        console.log(results);
    });

// Or use the aggregation pipeline builder for a more fluent call
Chat.aggregate()
    .match({ "userReceive": "ZungX" })
    .project({ "msg": 1, "withUser": "$userSend", "timestamp": 1, "_id": 0 })
    .exec(function(err, results){
        // handle err
        console.log(results);
    });

我正在努力解决这个问题——显示一个带有“from”和“to”字段的对话列表。 在您的情况下,您可以执行类似以下操作的聚合:

aggregate(
  [
    { $match: {$or: [{from: USERNAME}, {to: USERNAME}]}},
    { $project: {...FIELDS}},
    { $sort: { timestamp: -1} },
    {
      $group: {
        _id: {$concat: [{$userSend}, {$userReceive}]},
        userSend : {$first: '$from'},
        userReceive: {$first: '$to'},
        msg: {$first: '$msg'},
        timestamp: {$first: '$timestamp'}
      }
    }
  ]
)
但是,如果像我一样,您的“userSend”和“userReceive”字段不是纯字符串(比如ObjectId),那么最好添加一个“conversationId”字段保存为:

Chat.conversationId = [Receiver._id, Sender._id].sort().join('.')

您有重复的ID,也很难理解问题所在。尝试添加timestampsSr,我更改了_id(它是演示示例数据)并添加了timestamp。感谢您的回复。但是我试过了,没有结果。数组为空。我再次运行,它运行了,但是,它是获取当前其他用户发送的“ZungX”。它无法为其他用户获取用户ZungX发送的结果。我想使用$group,但我不知道如何使用它