在MongoDB的NoRM中使用HiLoIdGenerator创建唯一标识符

在MongoDB的NoRM中使用HiLoIdGenerator创建唯一标识符,mongodb,mongodb-.net-driver,norm,Mongodb,Mongodb .net Driver,Norm,我一直在为NoRM()附带的HiLoIdGenerator而努力;我想用它来生成一个唯一的标识符,我可以用它作为我博客文章的SLUG。目前,我使用ObjectId来唯一标识MongoDB中的文档,但由于它类似于GUID,并且在URL中看起来不太好,所以我更喜欢使用类似www.myblog.com/posts/1243的内容,这就是我决定使用HiLoIdGenerator的原因 我想在客户端生成我的HiLo id,我在stuart harris的博客上读到NoRM的新HiLo id生成器也允许这样

我一直在为NoRM()附带的HiLoIdGenerator而努力;我想用它来生成一个唯一的标识符,我可以用它作为我博客文章的SLUG。目前,我使用ObjectId来唯一标识MongoDB中的文档,但由于它类似于GUID,并且在URL中看起来不太好,所以我更喜欢使用类似www.myblog.com/posts/1243的内容,这就是我决定使用HiLoIdGenerator的原因

我想在客户端生成我的HiLo id,我在stuart harris的博客上读到NoRM的新HiLo id生成器也允许这样做,它将一系列整数分配给客户端会话,可以不受惩罚地使用(其他客户端将使用不同的范围)但是当我打开HiLoIdGenerator时,它说HiLoIdGenerator类使用HILO算法生成新的标识值。您的项目中只能使用此类的一个实例

我真的有三个问题:

1) 如果我的应用程序中有多个HiLoIdGenerator实例(比如说,我的服务类中有一个实例,为每个新文档调用GenerateId),我是否可以保证我的所有id都是唯一的,假设HiLoIdGenerator类的代码说在一个应用程序中应该只有这个类的一个实例

2) HiLoIdGenerator构造函数接受一个容量参数,我想知道它的作用是什么,我传递了0,生成的所有Id都是相同的,然后我传递了1个新的HiLoIdGenerator(1),Id从1开始,递增1;我真的不明白它是做什么的,但我认为它与生成器可以生成的一系列潜在值有关,但我不确定,我希望如此。有人能解释一下这个论点吗

3) 我想我理解这里解释的HiLo算法的目的,但我不理解的是,我是否可以有两个MongoDB实例,两个不同的应用程序分别查看一个不同的MongoDB实例,但都包含相同的集合类型,生成的id是否全局唯一,即。,我是否可以像使用GUID那样使用它们,或者它们在给定的MongoDB实例中是唯一的,因此在以后的某个日期将两个集合合并到一个MongoDB实例中是不可能的


感谢

有关如何生成单调递增ID的信息,请参见此处:

  • 是的,它们是唯一的,每个客户机(HiLoGenerator)都会请求一系列可以分配的lo,但它们只有在使用相同容量时才是唯一的

  • Capacity是客户端可以不受惩罚地分配的Id数量,同样,如果客户端之间有不同的容量,则有可能创建非唯一值,如果使用单调递增的Id,则仅分配单个顺序值,则不需要HiLo算法,您只需要一个包含一个可以递增并分配给新实体的值的位置,请参阅dm的答案以了解此实现

  • 是的,只要两个客户端都使用保存Hi值的相同集合,并且只要两个客户端使用相同的容量来生成lo值


  • 关于我的第二个问题,我认为容量只是一个代表Hi的值范围,在请求新Hi之前,该范围内的每个数字都可以指定为lo;如果我只分配一个id,那么将容量设置为1有意义吗?我想做的是使用HiLoIdGenerator,以便在将文档保存到MongoDB之前,可以在客户端获得可用的值,该insert if not present方法似乎是在db上执行的函数。cheers+1,因为我实际上使用的是单调递增的ID,但没有正确使用HiLoIdGenerator,如果您实际上只使用HiLoIdGenerator生成单调递增的ID,那么它将起作用,但它是多余的,因为您可以在单独的集合中使用一个字段,将其递增1并使用它,您不需要HiLo算法的开销,如果您一次分配2个以上的id,则应该使用HiLo算法,并且可能会有多个客户端分配这些id