在索引字段和可用光标上轮询MongoDb

Fre*_*ory 7 mongodb

在MongoDb关于tailable游标的文档中,它说明了以下内容:

如果您的查询位于索​​引字段上,请不要使用tailable游标,而是使用常规游标.跟踪查询返回的索引字段的最后一个值.要检索新添加的文档,请使用查询条件中索引字段的最后一个值再次查询集合

我正在设置查询以查找特定时间点之后的所有文档,然后在插入文档时保留它们.我想最简单的方法是在我想要的时候查询_id(假设我们使用的是ObjectIds,我们是).

由于_id是默认编入索引的,因此我用上一个_id继续轮询MongoDb有多糟糕并继续询问$ gt呢?我意识到这只能在1秒左右的精度内,因为ObjectIds只存储了自纪元以来的秒数,但我可以忍受,所以我假设我每秒至少要查询一次.

我想我只是惊讶于文档建议查询的方法(可能是在我的情况下不断),而不是保持一个可用的光标打开:我会认为推送会比拉动便宜吗?

Rah*_*hul 2

如果您使用可尾游标,我可以想到一些问题:

  1. 在我们到达“结束”之前,您必须收到集合中的每条消息
  2. 如果您耗尽了游标(及其await_data 延迟),则必须返回到开头。因此,在应用程序重新启动、数据库重新启动等情况下,您没有任何选择,只能从头开始迭代。

除了上述内容之外,使用可尾游标还有一些注意事项,因为它们仅适用于有上限的集合。

  1. 连接数量的可扩展性限制。每个客户端连接都会在 mongod 服务器(或 mongos)中添加一个连接线程。
  2. 上限集合具有固定的最大大小。文档的大小不能超过该大小。
  3. 您无法对上限集合进行分片
  4. 对上限集合中文档的任何更新都不得导致文档增长。(即并非所有$set操作都会起作用,并且不会$push$pushAll会)
  5. 您可能没有明确.remove()记录来自上限集合的内容
  6. 您无法控制从集合中删除哪个文档。它将像一个循环队列一样工作。

用我得到的最后一个 _id 不断轮询 MongoDb 并不断询问 $gt 的东西有多糟糕?

IMO,轮询确实会带来延迟和不必要的忙等待,即使没有更新,但你可以控制很多事情。

从性能角度来看,只要您使用索引字段进行查询,就不应该有问题。