MongoDB Long/Int(长整型)的自增长主键 解决方案

今朝有幸尝芒果,发现自增长ID类型有多种,唯独没有Long/Int。

一思路:
1. 自建一个Collection(表,假设名为:IdentityEntity,其中字段:_id, Key, Value,其中_id你懂的,Key:Collection名,需要用Long/Int自增长主键的Collection名,value:Key字段中所存Collection的Long/Int自增长最大值),此表用于存入要用Long/Int自增长主键的Collection信息(为方便举例:XLogs)
结构自建的Collection, IdentityEntity如下:
_id        Key      Value
new Guid()    XLogs      5

2. 每次往XLogs新增数据时,将当前最大值(5)取出来,然后再加1,我们知道自增长键是无需我们明确Insert的,当然它也一样整个过程都是由Mongo自身框架内部完成。

3. 既然是内部完成,我们就得实现一小部分代码,让Mongo框架来调用

二实现:

1. Mongo框架中的接口:IIdGenerator

2. 实现接口,代码:

 1 public class LongIdGenerator<TDocument, TKey> : IIdGenerator where TDocument : class
 2     {
 3         private static LongIdGenerator<TDocument, TKey> _instance = new LongIdGenerator<TDocument, TKey>();
 4         public static LongIdGenerator<TDocument, TKey> Instance { get { return _instance; } }
 5
 6         public object GenerateId(object container, object document)
 7         {
 8             TKey id = default(TKey);
 9             var collection = container as MongoCollection<TDocument>;
10             if (null != collection)
11             {
12                 var mongoDB = collection.Database;
13                 var idColl = mongoDB.GetCollection<IdentityEntity<TKey>>("IdentityEntity");
14                 var keyName = document.GetType().Name;
15                 id  = RealGenerateId(idColl, keyName) ;
16             }
17             return id;
18         }
19
20         private TKey RealGenerateId(MongoCollection<IdentityEntity<TKey>> idColl, string keyName)
21         {
22             TKey id;
23             var idQuery = new QueryDocument("Key", BsonValue.Create(keyName));
24             var idBuilder = new UpdateBuilder();
25             idBuilder.Inc("Value", 1);
26
27             var args = new FindAndModifyArgs();
28             args.Query = idQuery;
29             args.Update = idBuilder;
30             args.VersionReturned = FindAndModifyDocumentVersion.Modified;
31             args.Upsert = true;
32
33             var result = idColl.FindAndModify(args);
34             if (!string.IsNullOrEmpty(result.ErrorMessage))
35             {
36                 throw new Exception(result.ErrorMessage);
37             }
38             id = result.GetModifiedDocumentAs<IdentityEntity<TKey>>().Value;
39             return id;
40         }
41
42         public bool IsEmpty(object id)
43         {
44             if (null == id)
45             {
46                 return false;
47             }
48             return true;
49         }
50     }

2.2. 从上代码看我们知道,先要了解对Mongodb Collection的增,改,查等基本操作,然后理解“思路”中所提内容。注意Collection IdentityEntity在代码中已写死,当他不存在时第一次运行会自动新增此Collection。

三应用
到此已完成代码实现。即然实现,那么开始谈应用:
方式1.

 1  public class XLogs : BaseLog, IEntity<long>
 2     {
 3         //应用:在long自增长键上加此特性
 4         [BsonId(IdGenerator = typeof(LongIdGenerator<XLogs>))]
 5         public long Id { get; set; }
 6
 7         public byte Status { get; set; }
 8
 9         public string CreatedBy { get; set; }
10
11         public System.DateTime CreatedDate { get; set; }
12
13         public string Remark { get; set; }
14
15         public decimal Amount { get; set; }
16     }

方式2. 注册的方式,在数据进Collection XLogs之前,就要运行它

1 BsonClassMap.RegisterClassMap<XLogs>(rc =>
2             {
3                 rc.AutoMap();
4                 rc.SetIdMember(rc.GetMemberMap(c => c.Id));
5                 rc.IdMemberMap.SetIdGenerator(LongIdGenerator<XLogs, long>.Instance);
6             });

时间: 2024-11-15 18:04:07

MongoDB Long/Int(长整型)的自增长主键 解决方案的相关文章

【c语言】把一个长整型给一个字符指针

// 把一个长整型给一个字符指针,修改的时候只修改了一个字节,结果会是一个很大的随机数 // 并不能通过这种方式给长整型赋值1 #include <stdio.h> void VarInit(unsigned char* pucArg) { *pucArg = 1; return; } int main() { unsigned long ulGlobal; VarInit((unsigned char*)&ulGlobal); printf("%lu\n", ul

整形_长整型的使用范围和规则

整形_长整型的使用范围(两个数的乘积) 1. I.unsigned long :%lu ; unsigned long long :%llu. II.当结果在输出格式范围之内,则输出正确,否则不正确. III. 当结果在输出格式范围之外,则输出的值与结果模(变量类型的大小的值)相等,且输出的值在变量类型的范围内.这里若结果大于2^64,则上述结论不正确. Code: 1 #include <stdio.h> 2 #include <stdlib.h> 3   4 int main(

Json.NET特殊处理64位长整型数据

很多ASP.NET项目,尤其是使用了Ajax的项目,常常需要返回JSON格式的数据..NET框架从3.5版本开始提供了JSON的序列化和反序列化工具,不过个人感觉不太好用,后来找了第三方的Newtonsoft.Json来用.再后来,在MVC4中,微软已经默认使用Json.NET(Newtonsoft.Json)来处理JSON数据了. JavaScript数值精度是32位,如果整数数度超过32位,就会被当作浮点数处理.换句话说,如果从服务端生成的JSON,某个值是64位整数,传到前端JavaScr

Python 数值类型(整型、长整型、浮点型、复数型)

一.整型 In [1]: a = 123 # 定义整数类型 In [2]: type(a) # 查看数据类型 Out[2]: int -2147483648 —— 2147483647 # 整型的取值范围,如果超过了这个范围则成为长整型 二.长整型 In [7]: a = 123456789123456789123456789 # 定义长整型 In [8]: type(a) # 查看数据类型 Out[8]: long In [9]: a # 长整型后面会带有字母(l或L)以标识这是长整型 Out

PHP长整型在32位系统中强制转化溢出

CleverCode近期遇到一个PHP项目整形转化问题,mysql有一个字段id是bigint的,里面有长整型,如id = 5147486396.可是php代码因为历史原因却部署在多台机器中,当中A机器32位系统中,B机器64系统中.如今的问题是64系统中页面訪问正常.32位系统中訪问出错了.原因是php整形溢出. 1 A机器演示 1.1 获取A机器系统位数 # getconf LONG_BIT 1.2 整形转化代码 <? php $id = 5147486396; echo '$id:'.$i

整数、长整型、浮点型、字符串

如: 18.73.84 每一个整数都具备如下功能: int 二.长整型 可能如:2147483649.9223372036854775807 每个长整型都具备如下功能: long 三.浮点型 如:3.14.2.88 每个浮点型都具备如下功能: float 四.字符串 如:'wupeiqi'.'alex' 每个字符串都具备如下功能: str  

Java把长整型时间转成字符串日期

数据库里存放的是timestamp格式,前端取得后是这种:1436255550710长整型时间截转换成"2015-07-07"这种格式呢? import java.io.IOException; import java.text.SimpleDateFormat; import java.util.Date; public class Test { /** * Java把长整型时间转成字符串日期 * @param args * @throws IOException */ public

(DateTime)日期型数据转换成C#长整型数据

这里介绍日期型数据转换成C#长整型数据,由于各种数据库对日期型的定义和处理是不一样的,各种语言对日期型数据的定义的处理也各不相同,因为,我宁愿将日期型数据转换成长整型数据再保存到数据库中. AD:51CTO 网+ 第十二期沙龙:大话数据之美_如何用数据驱动用户体验 C#语言还是比较常见的东西,这里我们主要介绍日期型数据转换成C#长整型数据,包括介绍DateTime 的构造函数等方面. 转自:http://developer.51cto.com/art/200908/147684.htm 日期型数

php长整型原始输出

今天调用webservice时返回一个字段是int64 长整型 原始的数值应该是 190000002101056096 而php返回时转成 1.9000000210106E+17 当传入另一个接口就报错了 解决方法 $c=1.9000000210106E+17; 1 number_format() number_format($c,0,'','') 2 sprintf sprintf("%.0f",$c);