如何制作整数Id生成器?

Tim*_*Gim 7 c# mongodb

众所周知,mongoDb默认驱动程序不支持自动整数Id生成.我花了两天时间思考如何实现我自己的唯一整数值​​的id生成器.那么,如何制作呢?

mta*_*riq 6

在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"});
Run Code Online (Sandbox Code Playgroud)


Tim*_*Gim -4

像这样的东西:

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;
    }
}
Run Code Online (Sandbox Code Playgroud)

  • 即使它是线程安全的,它也无法与多个 Web 服务器一起工作。 (2认同)