MongoDB在特定的_id

时间:2016-06-15 13:28:18

标签: node.js mongodb

我正在创建某种真实聊天应用,但我遇到了麻烦。我想要做的是在指定_id之前阅读之前的50条消息(文档)。我会解释更多细节。

在第一次进入房间的用户中,App会自动加载最近的50条消息。之后,如果用户向上滚动到顶部,则会加载更多50条之前的消息。

问题是我不明白该怎么办。我的想法是找到所有文件并移动光标,但我尝试过的每一个都失败了。如果我记录"光标"控制台中的对象,它说:

  

承诺{< pending> }

所以,如果我这样做:

let cursor = db.find('room', { ... });

while(cursor.hasNext()) {
    cursor.next();
}

它无限循环,永不停止。如果将非常感谢gimme一只手。 :) 如果有其他方法不需要使用游标,那将非常好。

  • 还有一个最后一个问题:使用游标会导致性能低下吗?

1 个答案:

答案 0 :(得分:2)

我不确定您使用的是哪个库,cursor似乎是一个异步对象(Promise建议的那个),所以while循环无论如何都是错误的。由于NodeJS的单线程特性导致您不允许其他事件(即#34;我得到响应"),因此它将始终处于待处理状态。您可能必须使用回调,而不是同步循环。

但除此之外,我确实认为你的整个方法都不正确。

如果您知道如何加载最多最近 50条消息,那么这意味着您必须对集合进行某种逻辑排序。也许是一个时间戳(可能是id_的一部分)。

所以我建议的是类似于"分页":

  1. 在客户端设置timestamp_pointer = now()
  2. 查询:向我发送50条最新消息,例如timestamp < timestamp_pointer
  3. 在客户端设置timestamp_pointer = smallest timestamp of loaded messages
  4. 如果用户向上滚动,请返回第2点。
  5. 这种方法有几个优点,其中之一就是您不必担心连接会在短时间内出现问题,因为在用户端而不是在数据库端跟踪状态。并且使用适当的索引会非常快。

    是的,像你一样使用游标会导致性能低下,因为数据库必须跟踪查询,直到完全迭代。除了纯粹的内存和/或CPU使用外,它还有一些其他令人讨厌的缺点,比如Mongo在游标上有超时。如果用户在15分钟后向上滚动怎么办?默认情况下,光标上的超时为10分钟。要正确实施你的想法将非常困难。

    使用Postgres。 #PostgresEvangelist