如何制作整数 Id 生成器
本文关键字:Id 何制作 整数 | 更新日期: 2023-09-27 18:37:23
众所周知,mongoDb 默认驱动程序不支持自动生成整数 Id。我花了 2 天时间思考如何实现我自己的唯一整数值 id 生成器。那么,如何制作呢?
在MongoDB中进行自动增量Id不是很好的做法,因为我会在扩展服务器时受到伤害,但是如果要使自动增量值,则不建议迭代集合,而是创建一个单独的表(类似概念的序列)并从那里读取值并使用findAndModify递增它。每个表都是唯一的。
> db.counters.insert({_id: "userId", c: 0});
> var o = db.counters.findAndModify(
... {query: {_id: "userId"}, update: {$inc: {c: 1}}});
{ "_id" : "userId", "c" : 0 }
> db.mycollection.insert({_id:o.c, stuff:"abc"});
> o = db.counters.findAndModify(
... {query: {_id: "userId"}, update: {$inc: {c: 1}}});
{ "_id" : "userId", "c" : 1 }
> db.mycollection.insert({_id:o.c, stuff:"another one"});
我会使用 GUID 作为主键而不是整数。它主要有两个好处
-
它是线程安全的
-
您无需担心计算下一个 ID。
-
获取新 ID 所需的代码非常简单
Guid.NewGuid()
查看 CodingHorror 中的这篇有用文章,其中解释了在经典整数 ID 上使用 GUID 的优缺点。
一个迟到的答案,但我想我会发布这个:
https://github.com/alexjamesbrown/MongDBIntIdGenerator
我开始了一个增量ID生成器。
请注意 - 这远非理想,也不是 mongodb 的意图。
类似的东西:
public class UniqueIntGenerator : IIdGenerator
{
private static UniqueIntGenerator _instance;
public static UniqueIntGenerator Instance { get { return _instance; } }
static UniqueIntGenerator()
{
_instance = new UniqueIntGenerator();
}
public object GenerateId(object container, object document)
{
var cont = container as MongoCollection;
if (cont == null)
return 0;
var type = cont.Settings.DefaultDocumentType;
var cursor = cont.FindAllAs(type);
cursor.SetSortOrder(SortBy.Descending("_id"));
cursor.Limit = 1;
foreach (var obj in cursor)
return GetId(obj) + 1;
return 1;
}
private int GetId(object obj)
{
var properties = obj.GetType().GetProperties();
var idProperty = properties.Single(y => y.GetCustomAttributes(typeof(BsonIdAttribute), false).SingleOrDefault() != null);
var idValue = (int)idProperty.GetValue(obj, null);
return idValue;
}
public bool IsEmpty(object id)
{
return default(int) == (int)id;
}
}