mongodb int型id 自增
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
mongodb int型id 自增的更多相关文章
- SpringBoot+mongoDB实现id自增
这段时间给朋友做了一个微信小程序,顺便练习一下spring boot,虽然项目使用的是JPA+MySQL,但是好奇尝试了一下MongoDB实现自增ID,虽然MongoDB很少有自增ID的需求(在分布式 ...
- SQLITE数据表主键设置Id自增方法
SQLITE数据表主键设置Id自增方法 标签: sqliteintegerinsertnulltableapi 2010-01-12 08:39 35135人阅读 评论(8) 收藏 举报 分类: S ...
- Node.js、express、mongodb 入门(基于easyui datagrid增删改查)
前言 从在本机(win8.1)环境安装相关环境到做完这个demo大概不到两周时间,刚开始只是在本机安装环境并没有敲个Demo,从周末开始断断续续的想写一个,按照惯性思维就写一个增删改查吧,一方面是体验 ...
- int型长度
Ø 基本数据类型 C语言中只有4中基本数据类型——整型.浮点型.指针和聚合类型(如数组和结构等):所有其他类型都是从这4种基本类型的某种变化或组合派生而来. 一.整型家族 整型家族包括char.sh ...
- hibernate解决oracle的id自增?
以前做SSH项目时,涉及到的数据库是mySQL,只需将bean的配置文件id设为native 就可以实现表id的自增. 现在用到了Oracle,当然知道这样是不行的啦,那么用序列自增? 我在网络上搜索 ...
- mysql数据库单表只有一个主键自增id字段,ibatis实现id自增
mysql数据库单表只有一个主键自增id字段,ibatis实现id自增 <insert id="autoid"> insert into user_id ...
- EF中更新操作 ID自增但不是主键 ;根据ViewModel更新实体的部分属性
//ID自增但不是主键的情况 public int Update_join<TEntity>(TEntity entity) where TEntity : class { dbconte ...
- sql Server插不进数据,以及Id自增的教程及注意事项
参考于:https://jingyan.baidu.com/article/fec4bce244f902f2608d8b7a.html 使用SQL Server 2014 数据库做web的项目出现错误 ...
- sqlserver中将varchar类型转换为int型再进行排序的方法
sql中把varchar类型转换为int型然后进行排序,如果我们数据库的ID设置为varchar型的 在查询的时候order by id的话 如果我们数据库的ID设置为varchar型的 在查询的时候 ...
随机推荐
- c#字典怎么获取第一个键值 List<对象>获取重复项,转成Dictionary<key,List<对象>>
c#字典怎么获取第一个键值 Dictionary<string, int> dictionary = new Dictionary<string, int>(); dictio ...
- gridview获取选中行索引及当前行数据
gridview获取选中行索引及当前行数据 一.非直接绑定数据: <!--前台传值--> <asp:TemplateField HeaderText="操作"&g ...
- hdoj2604 Queuing(矩阵快速幂)
此题如果直接利用递推关系,处理不好会超内存的. 首先找出递推关系式,先给出递推关系式:( L )=( L - 1 ) + ( L - 3 ) + ( L - 4 ):可以先尝试推导一下,推不出来再看下 ...
- 日志分析与splunk浅谈
难易程度:★★★ 阅读点:linux;python;web安全;日志分析; 文章作者:xiaoye 文章来源:i春秋 关键字:网络渗透技术 前言 linux下的日志分析对企业来说非常重要,对我们分析p ...
- [小tips]使用vscode,根据vue模板文件生成代码
本着苍蝇虽小也是肉的精神...... 目标: 我们希望每次新建.vue文件后,VSCODE能够根据配置,自动生成我们想要的内容. 方法: 打开VSCODE编辑器,依次选择"文件 -> ...
- PHP之旅6 php的类与面向对象
对于类与面向对象的问题其实刚开始不用非要弄懂原因,直接先这样用,用多了你就发现你会了.所以 学习面向对象就先去做.用的多了你就发现这个就是这样的. 对于类的理解,我自己的理解就是:有一个叫做类的东西里 ...
- 第11章—使用对象关系映射持久化数据—SpringBoot+SpringData+Jpa进行查询修改数据库
SpringBoot+SpringData+Jpa进行查询修改数据库 JPA由EJB 3.0软件专家组开发,作为JSR-220实现的一部分.但它又不限于EJB 3.0,你可以在Web应用.甚至桌面应用 ...
- 第5章—构建Spring Web应用程序—关于spring中的validate注解后台校验的解析
关于spring中的validate注解后台校验的解析 在后台开发过程中,对参数的校验成为开发环境不可缺少的一个环节.比如参数不能为null,email那么必须符合email的格式,如果手动进行if判 ...
- ASP.NET:EntityFramework实现Session
ASP.NET默认的InProc模式的Session既浪费内存又在网站重启时存在数据丢失问题,SQLServer模式的Session只支持SQL Server又需要命令行配置.使用EntityFram ...
- 浅谈Android Studio中项目结构中project模式的各个文件和文件夹
致敬郭霖,这些知识是从第一行代码第二版中直接码下来的,谢谢他,注意每个条目前是否有. 1..gradle和.idea 这两个目录下放置的都是Android Studio自动生成的一些文件,我们无需关心 ...