在猫鼬中使用distinct、or、skip、limit和AND排序



我试图找到按时间戳排序的不同对话,条件是senderuserIdrecipientuserId。我认为唯一的方法是进行聚合。这就是我现在拥有的:

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来实现。

然后,您应该对这些命令进行排序。正确的顺序是:

  • sortlimit选项命令
  • $or是一个条件命令,根据
  • 最后,必须将distinct保留为一个单独的语句,因为它返回一个数组,并且不可链接

你最终会得到这段理论上的代码

Notification.find({
    $or: [
        sender: userId,
        recipient: userId
    ]
}, undefined, {
    skip: (page - 1) * LIMIT,
    limit: LIMIT,
    sort: {
        timestamp: 1
    }
}).distinct('conversationId', (err, results) => {
    // ***
});

我鼓励你测试一下,但我不能保证会有任何结果。希望它能有所帮助;)

最新更新