Mongodb Mongoose 对聊天消息进行排序和分页

Mongodb Mongoose sort and paginate chat messages

我正在制作一个聊天应用程序,每页加载 10 条消息。消息按从旧到新的顺序排序,因此新消息在底部,旧消息在顶部。我尝试使用 skip() 和 limit() 方法,但它不起作用。

let count = page*10

MessageModel.find(find_query).sort({createdAt: 'asc'}).skip(count-10).limit(10).exec();

例如:

让这些是我的消息,从旧到新排序:["1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12"]

上面的查询returns中的数据是这样的 第一页:["1", "2", "3", "4", "5", "6", "7", "8", "9", "10"]

第 2 页:["11", "12"]

但我想要它 return

第 1 页:["3", "4", "5", "6", "7", "8", "9", "10", "11", "12"]

第 2 页:["1", "2"]

编辑: 我尝试将其排序为降序和倒序,这似乎解决了问题。

let count = page*10

const messages = await MessageModel.find(find_query).sort({createdAt: 'desc'}).skip(count-10).limit(10).exec();

const re_messages = messages.reverse()

由于要先显示消息3到12,所以需要使用'desc'排序而不是'asc'排序,以便最先获得最新的消息。这会给你 ["12", "11", ... "4", "3"]。现在你所要做的就是反转这个数组得到 ["3", "4", ... "11", "12"]:

let count = page*10

let messages = await MessageModel
                        .find(find_query)
                        .sort({createdAt: 'desc'}) // get the latest ones
                        .skip(count-10)
                        .limit(10)
                        .exec()
                        .lean(); // Get a simple array

messages.reverse(); // ["3", "4", ... "11", "12"]