众所周知,mongoDb默认驱动程序不支持自动生成整数ID。我花了2天的时间思考如何实现我自己的唯一整数值的id生成器。那么,怎么做呢?
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"});
字符串
neekobn82#
**我会使用GUID作为主键,而不是整数。**它主要有两个好处
Guid.NewGuid()在CodingHorror中查看这个有用的article,它解释了使用GUID而不是传统整数ID的优缺点。
6mzjoqzu3#
一个迟来的答案,但我想我会发布这个:https://github.com/alexjamesbrown/MongDBIntIdGenerator我做了一个增量ID生成器的开始。注意-这远非理想,也不是mongodb的目的。
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; } }
4条答案
按热度按时间31moq8wy1#
在MongoDB中使Id自动递增不是一个好的做法,因为我会在扩展服务器时受到伤害,但是如果你想使值自动递增,那么不建议迭代你的集合,而是创建一个单独的表(类似序列的概念),并从那里读取值,然后使用findAndModify递增它。每个表都是唯一的。
字符串
neekobn82#
**我会使用GUID作为主键,而不是整数。**它主要有两个好处
Guid.NewGuid()
在CodingHorror中查看这个有用的article,它解释了使用GUID而不是传统整数ID的优缺点。
6mzjoqzu3#
一个迟来的答案,但我想我会发布这个:
https://github.com/alexjamesbrown/MongDBIntIdGenerator
我做了一个增量ID生成器的开始。
注意-这远非理想,也不是mongodb的目的。
2izufjch4#
就像这样:
字符串