我试图找到按时间戳排序的不同对话,条件是sender
是userId
或recipient
是userId
。我认为唯一的方法是进行聚合。这就是我现在拥有的:
Notification.aggregate([
// { $or: [ { $sender: userId }, { $recipient: userId } ] },
{ $group: { _id: '$conversationId' } },
{ $skip: (page - 1) * LIMIT },
{ $limit: LIMIT },
{ $sort: { timestamp: 1 } }
], function (err, result) {
// console.log(result);
return result;
});
然而,我收到了一个"双重回调"错误(因此我注释掉了有问题的$or
行。
伪代码(我正试图实现)是:
Notification.find().or([
{ sender: userId },
{ recipient: userId }
])
.distinct('conversationId')
.sort('-timestamp')
.limit(LIMIT)
.skip((page - 1) * LIMIT)
.exec(function (error, result) {
return result;
});
其中一些(如果不是全部)可以通过了解如何使用猫鼬的find
来实现。
然后,您应该对这些命令进行排序。正确的顺序是:
sort
和limit
是选项命令$or
是一个条件命令,根据- 最后,必须将
distinct
保留为一个单独的语句,因为它返回一个数组,并且不可链接
你最终会得到这段理论上的代码
Notification.find({
$or: [
sender: userId,
recipient: userId
]
}, undefined, {
skip: (page - 1) * LIMIT,
limit: LIMIT,
sort: {
timestamp: 1
}
}).distinct('conversationId', (err, results) => {
// ***
});
我鼓励你测试一下,但我不能保证会有任何结果。希望它能有所帮助;)