MongoDB中的自动增量以存储唯一用户ID的序列

est*_*est 21 uniqueidentifier auto-increment bitarray bitset mongodb

我正在建立一个分析系统,API调用将提供唯一的用户ID,但它不是按顺序而且太稀疏.

我需要为每个唯一用户ID提供一个自动增量ID,以在bitarray/bitset中标记分析数据点.因此,第一个用户遇到的对应于比特阵列的第一个比特,第二个用户将是比特阵列中的第二个比特,等等.

那么在MongoDB中生成增量唯一用户ID有一种可靠而快速的方法吗?

exp*_*ert 22

如选择的答案所示,您可以使用findAndModify生成顺序ID.

但我强烈不同意你不应该这样做的意见.这一切都取决于您的业务需求.具有12字节ID可能非常消耗资源并且在将来导致显着的可伸缩性问题.

在这里有详细的答案.

  • @TinoCosta'ElNino'你所说的不会创建增量字段,它只在归档的“number”上创建索引,并且该索引是增量的并强制唯一性,它不会以任何方式自动增量字段,甚至不会需要它或默认拥有它。 (2认同)

Kon*_*uda 14

你可以,但你不应该 https://web.archive.org/web/20151009224806/http://docs.mongodb.org/manual/tutorial/create-an-auto-incrementing-field/

mongo中的每个对象都有一个id,它们按插入顺序排序.获取用户对象的集合,迭代它并将其用作递增的ID有什么问题?呃完全去那种地图减少工作

  • 问题是并发的。迭代将发出重复的增量ID。 (2认同)

Ale*_*las 7

我知道这是一个古老的问题,但我会为后人发布我的答案......

这取决于您正在构建的系统以及适当的特定业务规则.

我正在MongoDb,C#(Backend API)和Angular(前端Web应用程序)中构建中到大规模的CRM,并发现ObjectId在Angular Routing中用于选择特定实体非常糟糕.与API控制器路由相同.

上面的建议对我的项目非常有效.

db.contacts.insert({
 "id":db.contacts.find().Count()+1,
 "name":"John Doe",
 "emails":[
    "john@doe.com",
    "john.doe@business.com"
 ],
 "phone":"555111322",
 "status":"Active"
});
Run Code Online (Sandbox Code Playgroud)

它适用于我的情况,但不是所有情况的原因是,正如上面的注释所述,如果从集合中删除3条记录,则会发生冲突.

我的业务规则规定,由于我们内部的SLA,我们不允许删除通信数据或客户记录超过我正在编写的应用程序的潜在生命周期,因此,我只是用枚举"状态"标记记录这是"活动"或"已删除".你可以从用户界面中删除一些内容,它会说"联系人已被删除",但所有应用程序都已将联系人的状态更改为"已删除",当应用程序调用存储库获取联系人列表时,我会过滤在将数据推送到客户端应用程序之前删除记录.

因此,db.collection.find().count()+ 1对我来说是一个完美的解决方案......

它不适用于所有人,但如果您不删除数据,它可以正常工作.

  • 这在并发设置中不会很好。如果他们同时进行计数,您可以轻松获得具有相同 _id 的文档。 (3认同)
  • 绝对地!在我的例子中,我根本不需要处理并发或分片,所以使用 find().Count()+1 没有任何问题正如我原来的答案一样,这并不适用于每个人情况,但它在我的特定场景中确实有效。应用程序现已投入生产近 12 个月,在我的 id 递增方面没有出现任何问题。 (2认同)