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