4

我有一个应用程序通过查询 ts 字段来读取 mongodb 2.2 副本集中的 oplog.rs 集合。

我在 ts 字段上添加了一个索引,但是当新条目插入 oplog 时它不会更新。

我错过了什么?我在 mongodb 文档中找不到关于不支持上限集合索引的任何内容(相反),并且我找不到任何关于 oplog 特殊的信息。

谢谢

4

2 回答 2

9

正如您所发现的,系统集合(例如local.oplog.rs和)不支持二级索引*.system.profile。在 MongoDB 2.4 和更早版本中,索引似乎已经创建,但实际上从未更新。如果您尝试使用不受支持的更改(例如尝试创建其他索引)直接更新系统集合,较新版本的 MongoDB (2.6+) 会返回错误。

oplog.rs集合绝对是“特殊的”,因为它的预期用途仅用于复制。复制内部在此基础上对 oplog 的预期操作做出了一些假设。例如,复制只需要插入 oplog 条目——与您自己创建的上限集合不同,oplog 条目永远不会更新。

如果应用程序需要跟踪插入到 oplog 中的新条目,或者使用order进行查找,则应用程序应该使用可尾光标读取 oplog 。$natural

尾光标教程更详细地介绍了使用方法,但需要注意的一些特别之处是:

  • Tailable 游标不使用索引并以自然顺序返回文档。
  • 因为可尾游标不使用索引,查询的初始扫描可能很昂贵;但是,在最初用尽游标之后,对新添加文档的后续检索成本很低
于 2013-05-08T14:58:46.340 回答
0

我错过了什么?我在 mongodb 文档中找不到关于不支持上限集合索引的任何内容(相反),并且我找不到任何关于 oplog 特殊的信息。

您的问题对于您当前的实施方式有点模糊。但是,似乎不是索引没有更新,而是您没有收到更新通知,因为 MongoDB 还没有 pub/sub 功能:https ://jira.mongodb.org/browse/SERVER-3385

您可以在此集合( http://docs.mongodb.org/manual/tutorial/create-tailable-cursor/ )上使用可尾光标来实际获取长时间的更新。

于 2013-03-13T15:42:26.460 回答