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<User>(cm => {
cm.GetMemberMap(x => x.Id).SetIdGenerator(new IntIdGenerator());
});

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

 

 

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

https://github.com/alexjamesbrown/MongDBIntIdGenerator

最新文章

  1. iOS9适配 之 关于info.plist 第三方登录 添加URL Schemes白名单
  2. Activiti 部署流程定义及相关的表(classpath部署、zip部署)
  3. HTML5和css3的总结三
  4. MecAnim
  5. hdoj 5328 Problems killer
  6. 商户怎样选择商业wifi进行移动营销
  7. linux内存负载分析
  8. 传感器仿真平台——UI绘制模块(二)
  9. hdu1358Period
  10. java实现的Trie树数据结构
  11. Html中截切文章内容,造成标签不全的问题
  12. 限制QLineEdit的数值输入范围(一共4种限制器:QDoubleValidator, QIntValidator, QRegExpValidator, 和QRegularExpressionValidator)
  13. bsh for android : 北京
  14. Ext &amp; Java 上存图片 Demo
  15. centos后台运行Python
  16. jQuery使用(九):队列及实现原理、基于队列模拟实现animate()
  17. ThreadLocal源码调试——“this”作为key
  18. ReactNative学习笔记(七)Navigator的使用
  19. List去重问题
  20. 调整图像的灰度级数C++实现

热门文章

  1. Spring Boot - Spring Data
  2. 【新题】OCP 062题库出现很多新题-6
  3. “全栈2019”Java多线程第二十三章:活锁(Livelock)详解
  4. arya-sites模块的主要类
  5. Kafka运行环境优化实践
  6. [AIR] AIR程序调用本地默认应用程序打开本地文件
  7. D06——C语言基础学PYTHON
  8. 中国云运营商横向对比——IaaS服务对标
  9. 数据结构---散列表查找(哈希表)概述和简单实现(Java)
  10. Odoo9.0模块开发全流程