これは一般的なユースケースのようです...しかし、どういうわけか私はそれを機能させることができません。
ユニークなアイテムを持つ列挙ストアとしてMongoDBを使用しようとしています。byte [] Id(一意のID)とタイムスタンプ(長い、列挙に使用される)を使用してコレクションを作成しました。ストアは非常に大きく(テラバイト)、さまざまなサーバーに分散しています。私はまだテスト段階にあるので、現在、ストアを最初から再構築することができます。
私がやりたいのは2つのことです。
- 挿入するアイテムごとに一意のIDを作成します。これは基本的に、同じIDを2回挿入すると、MongoDBがこれを検出してエラーを出すことを意味します。このアプローチはうまくいくようです。
- 他のプロセスによる新しいアイテムのストアを継続的に列挙します。私が採用したアプローチは、InsertIDに2番目のインデックスを追加し、サーバー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);
}
カーソルについて読みましたが、新しいアイテムがストアに挿入されたときに、カーソルが要件を満たしているかどうかわかりません。
私が言ったように、私はテーブル構造などに縛られていません...重要なのは、時間の経過とともに新しいアイテムを取得できることと、重複するアイテムを取得できないことだけです。
-ステファン。