这似乎是一个常见的用例...但不知何故,我无法得到它的工作。如何使用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