mongodb 如何制作一个整数ID生成器?

i5desfxk  于 2023-08-04  发布在  Go
关注(0)|答案(4)|浏览(107)

众所周知,mongoDb默认驱动程序不支持自动生成整数ID。我花了2天的时间思考如何实现我自己的唯一整数值的id生成器。那么,怎么做呢?

31moq8wy

31moq8wy1#

在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"});

字符串

neekobn8

neekobn82#

**我会使用GUID作为主键,而不是整数。**它主要有两个好处

  • 它是线程安全的
  • 您无需担心计算下一个ID。
  • 获取新ID所需的代码非常简单

Guid.NewGuid()
在CodingHorror中查看这个有用的article,它解释了使用GUID而不是传统整数ID的优缺点。

6mzjoqzu

6mzjoqzu3#

一个迟来的答案,但我想我会发布这个:
https://github.com/alexjamesbrown/MongDBIntIdGenerator
我做了一个增量ID生成器的开始。
注意-这远非理想,也不是mongodb的目的。

2izufjch

2izufjch4#

就像这样:

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;
    }
}

字符串

相关问题