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,但我不知道如何使用它