码迷,mamicode.com
首页 > 数据库 > 详细

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

时间:2015-02-11 12:40:57      阅读:364      评论:0      收藏:0      [点我收藏+]

标签:

今朝有幸尝芒果,发现自增长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             });

 

技术分享

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

标签:

原文地址:http://www.cnblogs.com/Jagre/p/4285797.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!