我正在创建某种真实聊天应用,但我遇到了麻烦。我想要做的是在指定_id之前阅读之前的50条消息(文档)。我会解释更多细节。
在第一次进入房间的用户中,App会自动加载最近的50条消息。之后,如果用户向上滚动到顶部,则会加载更多50条之前的消息。
问题是我不明白该怎么办。我的想法是找到所有文件并移动光标,但我尝试过的每一个都失败了。如果我记录"光标"控制台中的对象,它说:
承诺{< pending> }
所以,如果我这样做:
let cursor = db.find('room', { ... });
while(cursor.hasNext()) {
cursor.next();
}
它无限循环,永不停止。如果将非常感谢gimme一只手。 :) 如果有其他方法不需要使用游标,那将非常好。
答案 0 :(得分:2)
我不确定您使用的是哪个库,cursor
似乎是一个异步对象(Promise
建议的那个),所以while循环无论如何都是错误的。由于NodeJS的单线程特性导致您不允许其他事件(即#34;我得到响应"),因此它将始终处于待处理状态。您可能必须使用回调,而不是同步循环。
但除此之外,我确实认为你的整个方法都不正确。
如果您知道如何加载最多最近 50条消息,那么这意味着您必须对集合进行某种逻辑排序。也许是一个时间戳(可能是id_
的一部分)。
所以我建议的是类似于"分页":
timestamp_pointer = now()
timestamp < timestamp_pointer
timestamp_pointer = smallest timestamp of loaded messages
这种方法有几个优点,其中之一就是您不必担心连接会在短时间内出现问题,因为在用户端而不是在数据库端跟踪状态。并且使用适当的索引会非常快。
是的,像你一样使用游标会导致性能低下,因为数据库必须跟踪查询,直到完全迭代。除了纯粹的内存和/或CPU使用外,它还有一些其他令人讨厌的缺点,比如Mongo在游标上有超时。如果用户在15分钟后向上滚动怎么办?默认情况下,光标上的超时为10分钟。要正确实施你的想法将非常困难。
使用Postgres。 #PostgresEvangelist