我有一个应用程序通过查询 ts 字段来读取 mongodb 2.2 副本集中的 oplog.rs 集合。
我在 ts 字段上添加了一个索引,但是当新条目插入 oplog 时它不会更新。
我错过了什么?我在 mongodb 文档中找不到关于不支持上限集合索引的任何内容(相反),并且我找不到任何关于 oplog 特殊的信息。
谢谢
我有一个应用程序通过查询 ts 字段来读取 mongodb 2.2 副本集中的 oplog.rs 集合。
我在 ts 字段上添加了一个索引,但是当新条目插入 oplog 时它不会更新。
我错过了什么?我在 mongodb 文档中找不到关于不支持上限集合索引的任何内容(相反),并且我找不到任何关于 oplog 特殊的信息。
谢谢
正如您所发现的,系统集合(例如local.oplog.rs
和)不支持二级索引*.system.profile
。在 MongoDB 2.4 和更早版本中,索引似乎已经创建,但实际上从未更新。如果您尝试使用不受支持的更改(例如尝试创建其他索引)直接更新系统集合,较新版本的 MongoDB (2.6+) 会返回错误。
该oplog.rs
集合绝对是“特殊的”,因为它的预期用途仅用于复制。复制内部在此基础上对 oplog 的预期操作做出了一些假设。例如,复制只需要插入 oplog 条目——与您自己创建的上限集合不同,oplog 条目永远不会更新。
如果应用程序需要跟踪插入到 oplog 中的新条目,或者使用order进行查找,则应用程序应该使用可尾光标读取 oplog 。$natural
可尾光标教程更详细地介绍了使用方法,但需要注意的一些特别之处是:
- Tailable 游标不使用索引并以自然顺序返回文档。
- 因为可尾游标不使用索引,查询的初始扫描可能很昂贵;但是,在最初用尽游标之后,对新添加文档的后续检索成本很低
我错过了什么?我在 mongodb 文档中找不到关于不支持上限集合索引的任何内容(相反),并且我找不到任何关于 oplog 特殊的信息。
您的问题对于您当前的实施方式有点模糊。但是,似乎不是索引没有更新,而是您没有收到更新通知,因为 MongoDB 还没有 pub/sub 功能:https ://jira.mongodb.org/browse/SERVER-3385
您可以在此集合( http://docs.mongodb.org/manual/tutorial/create-tailable-cursor/ )上使用可尾光标来实际获取长时间的更新。