博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
mongodb int型id 自增
阅读量:6424 次
发布时间:2019-06-23

本文共 1523 字,大约阅读时间需要 5 分钟。

mongo的c#客户端提供了接口IIdGenerator,有guid和objectid等几种实现,但没有int型id的实现

接口主要2个方法,一个IsEmpty返回bool,判断当前id值是否是空(估计是当空值,就意味着需要生成,所以对于int来说,只要判断他是不是0就可以了)

另一个方法是生成的主要方法

public object GenerateId(object container, object document)

container就是collection,document就是添加的东西

我们自增id,需要从当前的collection中查出最大的id,然后+1返回作为新的id

var cont = container as MongoCollection;
var type = cont.Settings.DefaultDocumentType;var map = BsonClassMap.GetRegisteredClassMaps().FirstOrDefault(x => x.ClassType.Name == cont.Name);if (type == null){    type = map.ClassType;}var cursor = cont.FindAllAs(type);cursor.SetSortOrder(SortBy.Descending("_id"));cursor.Limit = 1;

这是一个查询,相当于 top 1 order by _id desc,最后取出对象,需要反射读取id,然后+1返回

 

还有mapreduce方式

var map = new BsonJavaScript(@"function(){var max=0;if(this._id>max){max=this._id;}emit(0,max);}");var reduce = new BsonJavaScript("function(key,values){var max=0;values.forEach(function(value){if(value>max){max=value;}});return max;}");var mr = cont.MapReduce(map, reduce);var result = mr.GetResults();var x = result.FirstOrDefault();if (x != null){    var y = x["value"];    return y.ToInt32() + 1;}

第一次搞mapreduce,思路不太清楚。

大概理解,map阶段,就是分组阶段,reduce就是对每个分组进行处理

我一开始emit{this._id,this._id}他总是返回一堆数据。因为是按照emit的第一参数来分组的,那每个id等于是自己一组

把组写死,值是id,就可以把所有的id放到一组里取最大值了。

BsonClassMap.RegisterClassMap
(cm => { cm.GetMemberMap(x => x.Id).SetIdGenerator(new IntIdGenerator());});

通过BsonClassMap设置id generator。为了更好的性能,应该单例化

 

 

另外,这里有一个写好的int id generator,支持int32和int64,有兴趣可以看看

转载于:https://www.cnblogs.com/czcz1024/p/3429408.html

你可能感兴趣的文章
JPA之EntityManager API
查看>>
系统目录结构、ls命令、文件类型、alias命令
查看>>
weblogic 部署的坑 DeploymentService:290066 invalid header field
查看>>
搭建属于自己的网站
查看>>
ssh如何通过跳板机直接访问到后端服务器(Mac&Linux&Windows解决方案)
查看>>
Server 2003 远程登录断开会话和连接数
查看>>
javascript 字符串函数
查看>>
泰州市互联网单位信息网络安全保护技术交流会
查看>>
数据库正在使用,所以无法获得对数据库的独占访问权---还原或删除数据库的解决方法...
查看>>
mysql 用drop和delete方法删除用户的区别
查看>>
华为机器万能密码
查看>>
为什么要使用 Docker
查看>>
实现高可用性网络的方法
查看>>
html5基础语句(学习)
查看>>
linux加密解密基础
查看>>
ECS服务器被脚本挖矿了,CPU100%负载
查看>>
IIS SSL客户端证书(忽略/接受/必须)之三——思考验证(1)
查看>>
Angular 文档中链接的修改路径
查看>>
JTable内容居中显示
查看>>
MySQL内置help解析(SQL语句说明书)
查看>>