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 自增的更多相关文章

  1. SpringBoot+mongoDB实现id自增

    这段时间给朋友做了一个微信小程序,顺便练习一下spring boot,虽然项目使用的是JPA+MySQL,但是好奇尝试了一下MongoDB实现自增ID,虽然MongoDB很少有自增ID的需求(在分布式 ...

  2. SQLITE数据表主键设置Id自增方法

    SQLITE数据表主键设置Id自增方法 标签: sqliteintegerinsertnulltableapi 2010-01-12 08:39 35135人阅读 评论(8) 收藏 举报  分类: S ...

  3. Node.js、express、mongodb 入门(基于easyui datagrid增删改查)

    前言 从在本机(win8.1)环境安装相关环境到做完这个demo大概不到两周时间,刚开始只是在本机安装环境并没有敲个Demo,从周末开始断断续续的想写一个,按照惯性思维就写一个增删改查吧,一方面是体验 ...

  4. int型长度

    Ø  基本数据类型 C语言中只有4中基本数据类型——整型.浮点型.指针和聚合类型(如数组和结构等):所有其他类型都是从这4种基本类型的某种变化或组合派生而来. 一.整型家族 整型家族包括char.sh ...

  5. hibernate解决oracle的id自增?

    以前做SSH项目时,涉及到的数据库是mySQL,只需将bean的配置文件id设为native 就可以实现表id的自增. 现在用到了Oracle,当然知道这样是不行的啦,那么用序列自增? 我在网络上搜索 ...

  6. mysql数据库单表只有一个主键自增id字段,ibatis实现id自增

    mysql数据库单表只有一个主键自增id字段,ibatis实现id自增 <insert id="autoid">        insert into user_id ...

  7. EF中更新操作 ID自增但不是主键 ;根据ViewModel更新实体的部分属性

    //ID自增但不是主键的情况 public int Update_join<TEntity>(TEntity entity) where TEntity : class { dbconte ...

  8. sql Server插不进数据,以及Id自增的教程及注意事项

    参考于:https://jingyan.baidu.com/article/fec4bce244f902f2608d8b7a.html 使用SQL Server 2014 数据库做web的项目出现错误 ...

  9. sqlserver中将varchar类型转换为int型再进行排序的方法

    sql中把varchar类型转换为int型然后进行排序,如果我们数据库的ID设置为varchar型的 在查询的时候order by id的话 如果我们数据库的ID设置为varchar型的 在查询的时候 ...

随机推荐

  1. 解决 EntityFrameworkCore 执行 Add-Migration命令提示无法识别转义符的错误

    版本.asp.net core 2.0   EntityFrameworkCore2,0,. 之前执行Add-Migration 命令 提示无法识别的转义序列,各种不成功, 解决办法,找到 项目里面的 ...

  2. C# 实现邮件代发

    由于自己很好奇,有一些推广之类的 邮件,发件人后面,都有一个 由 .... 代发. 所以,查找了一些资料,来验证了一下实现方法. 咱们先来看看,实现代发的 理想效果图 当然,这一种,是利用 代发的 邮 ...

  3. Kubernetes性能测试实践

    本文由  网易云 发布. 概述 随着容器技术的发展,容器服务已经成为行业主流,然而想要在生产环境中成功部署和操作容器,关键还是容器编排技术.市场上有各种各样的容器编排工具,如Docker原生的Swar ...

  4. C语言参数传递(值传递、地址传递)+二级指针

    参数传递 C语言参数传递一般分为:值传递和地址传递(本质上只有值传递) (注意:C语言中没有引用传递,C++才有引用传递,因为很多C语言环境是用C++编译器编译,使得C看起来支持引用传递,导致很多网上 ...

  5. 从 falcon api 中获取数据

    import json import time import requests openfalcon = 'http://ip:port/api/v1' user = 'user' password ...

  6. VSCode保存插件配置并使用 gist 管理代码片段

    setting sync 保存配置 由于公司和家里都使用 VSCode 作为主要编辑器,同步配置是最紧要的.VSCode 提供了setting sync插件,很方便我们同步插件配置.引用网上教程: 在 ...

  7. 实现可搜索仿select下拉选中

    由于在优化项目中,发现先前写的一个活化石级的的可搜索下拉功能在高速搜索中会出现卡顿现象 1.起初的解决方法是在搜索事件中加入防抖函数隔一段时间才去触发他,同时搜索的不再是html文档片段,而是直接对数 ...

  8. 【GDKOI2016】 魔卡少女 线段树

    题目大意:给你一个长度为n的序列${a_1....a_n}$,有$m$次操作 每次操作有两种情况:修改$a_i$的值,询问$[l,r]$中所有子区间的异或和. 数据范围:$n,m≤10^5$,$a_i ...

  9. js05

    继续学习js,在这里我们主要讲述一下js的BOM(浏览器对象模型)以及一些js库和应用这些js库的方法. 1.浏览器对象模型(BOM):    window对象:        表示浏览器窗口,所有的 ...

  10. centos7.2 get pid by process name with python3.6

    centos7.2 get pid by process name with python3.6 #-*- encoding:UTF-8 -*- import os import sys import ...