zoukankan      html  css  js  c++  java
  • 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

  • 相关阅读:
    delete 用法总结
    js数组去重的常用方法总结
    学习中 常用到的string内置对象方法的总结
    Array 对象常用的方法总结
    javascript中运算符有哪些? 他们的优先级 呢?
    那些年前端经典面试题
    HHVM 3.0 发布,执行 PHP 的虚拟机
    【问底】徐汉彬:PHP7和HHVM的性能之争 (真是学到了很多)
    mysql 简单sql语句
    【问底】王帅:深入PHP内核(一)——弱类型变量原理探究
  • 原文地址:https://www.cnblogs.com/czcz1024/p/3429408.html
Copyright © 2011-2022 走看看