2013-03-13 64 views
1

我有一個應用程序通過查詢ts字段來讀取mongodb 2.2副本集中的oplog.rs集合。oplog.rs中ts字段的索引沒有更新

我在ts字段中添加了一個索引,但是當新條目插入oplog時它不會更新。

我錯過了什麼?我在mongodb文檔中找不到任何關於capped集合上的索引不被支持的情況(相反),並且我找不到有關oplog特別的信息。

感謝

+0

你是如何確定索引未被適當更新的? – 2013-03-13 16:48:25

+0

我通過使用ts字段以自然(插入)順序讀取oplog條目與讀取來結合信息。當插入新數據時,我得到不一致的結果。如果我手動更新ts索引,我會得到正確的結果。 – 2013-03-13 21:21:04

+0

而你正在閱讀帶尾光標或普通光標的oplog條目? – 2013-03-14 16:49:00

回答

3

正如您發現的那樣,系統集合(例如local.oplog.rs*.system.profile)上不支持二級索引。在MongoDB 2.4及更高版本中,索引似乎已創建,但從未實際更新過。如果嘗試直接使用不受支持的更改(例如嘗試創建其他索引)來更新系統集合,則較新版本的MongoDB(2.6+)會返回錯誤。

oplog.rs集合絕對是「特殊」的,因爲它的預期用途僅用於複製。複製內部在此基礎上對oplog的預期操作進行了一些假設。例如,複製只需要插入oplog條目 - 與您可能創建的上限集合不同,oplog條目爲從未更新過

如果應用程序需要遵循插入到oplog中的新條目或使用$natural order執行查找,則預計應用程序將以tailable cursor讀取oplog。

tailable cursor tutorial進入上使用的一些更詳細的,但是要注意的幾個特定點是:

  • Tailable遊標不使用索引和自然順序返回文檔。
  • 由於可滾動遊標不使用索引,因此查詢的初始掃描可能很昂貴;但是,在初始耗盡光標之後,隨後檢索新添加的文檔是便宜的
0

我缺少什麼?我在mongodb文檔中找不到任何關於capped集合上的索引不被支持的情況(相反),並且我找不到有關oplog特別的信息。

你的問題是一個模糊的問題,你到底是怎麼想你目前的實施。然而,它似乎不是索引沒有更新,而是你不更新通知,因爲MongoDB中沒有的pub/sub功能尚未:https://jira.mongodb.org/browse/SERVER-3385

您可以在此集合(http://docs.mongodb.org/manual/tutorial/create-tailable-cursor/)使用tailable光標實際上在較長時間內獲得更新。

+0

應用程序偶爾會通過查詢ts字段從oplog中讀取數據,並且它會返回過期的結果。當我手動重新索引它按預期工作。 – 2013-03-13 15:54:15

+0

@Sammaye:FYI,問題實際上是'oplog.rs'是一個「特殊」封頂集合,旨在用於複製。複製內部進行快速插入,忽略索引(因爲對於普通複製和可放大的遊標,預計/不需要這些)。在MongoDB 2.4中,額外的索引不會被更新。對PubSub或使用索引的可放大光標的未來支持可能會改變這一點。 – Stennie 2013-05-08 15:09:37

+0

@Stennie這是在文檔中提到的東西因爲我剛剛讀完所有的複製部分,我無法找到提及插入到oplog忽略索引構建中的內容。 – Sammaye 2013-05-08 15:13:38