這似乎是一個常見的用例...但不知何故,我無法得到它的工作。如何使用MongoDB作爲唯一/枚舉存儲
我正在嘗試使用MongoDB作爲具有唯一項目的枚舉存儲。我創建了一個帶有byte [] Id(唯一ID)和一個時間戳(一個long,用於枚舉)的集合。該商店相當大(千兆字節),並分佈在不同的服務器中。目前我能夠從零開始重建商店,因爲我仍處於測試階段。
我想要做的是兩兩件事:
- 創建我插入每個項目的唯一ID。這基本上意味着如果我插入兩次相同的ID,MongoDB將檢測到這個並給出錯誤。這種方法似乎很好。
- 通過其他進程連續枚舉新商品的商店。我採用的方法是爲InsertID添加第二個索引,並在服務器ID和計數器上使用高精度時間戳(僅用於使其唯一併且升序)。
在最好的情況下,這將意味着枚舉器會跟蹤每個服務器的索引遊標。從我從mongodb查詢處理中學到的東西,我預料到了這種行爲。但是,當我嘗試執行代碼(下面)時,似乎需要永遠得到任何東西。
long lastid = 0;
while (true)
{
DateTime first = DateTime.UtcNow;
foreach (var item in collection.FindAllAs<ContentItem>().OrderBy((a)=>(a.InsertId)).Take(100))
{
lastid = item.InsertId;
}
Console.WriteLine("Took {0:0.00} for 100", (DateTime.UtcNow - first).TotalSeconds);
}
我已閱讀關於遊標,但我不確定是否滿足新條目插入商店時的要求。
正如我所說的,我沒有綁定到任何表結構或類似的東西......唯一重要的是我可以隨着時間的推移獲得新的項目,而不會獲得重複的項目。
-Stefan。
我不確定如果我有你的問題!但是,爲什麼不讓mongodb生成uniqueId。它已經做到了! – 2012-07-06 12:04:40
你需要的是確保一個字符串不被枚舉兩次,或者用另一種方式說兩個ID不應該有相同的值! – 2012-07-06 12:05:22
聽起來好像你正在使用分片(*多個計算機*)。這裏你的碎片鑰匙是什麼?你有多少臺服務器?通過跨多個服務器的二級索引查詢可能是您的問題,但我需要更多關於您的配置的詳細信息。 – 2012-07-06 22:51:46