首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 数据库 > 其他数据库 >

替MongoDB增加自增长主键生成的功能

2012-09-22 
为MongoDB增加自增长主键生成的功能每个MongoDB的document都有一个_id字段作为它的第一个属性,这个值通常

为MongoDB增加自增长主键生成的功能

每个MongoDB的document都有一个_id字段作为它的第一个属性,这个值通常是一个BSON对象id,因此,这个id对于集合中的每个成员都是唯一的,如果用户插入一个document没有提供一个id,数据库将自动生成一个id,并存储在_id字段。???
???The?BSON?ObjectId?Datatype ??
一个BSON?ObjectID是由12个字节组成:4字节时间+3字节机器id+2字节进程id+3字节的数字
{?"_id"?:?ObjectId("4c691e72ed2a47b462dfa806")?}


有时候我们的应用中需要自增长的数字型主键,MongoDB在这方面并没有给我们提供支持,我们需要加以改造,使其具有自增长主键生成的功能。此次的功能改造,依赖的是morphia开源项目(MongoDB在java语言上的ORM实现,http://code.google.com/p/morphia/),直接上代码吧。


首先定义一个保存各个 collection的主键增量值的系统配置collection:StoredSeqence

java?代码
  1. /** ??*?MongoDB自增长主键维护队列,类似于MSSQL,Oracle维护主键的方式 ?
  2. ?*? ??*?@author?yongtree ?
  3. ?*?@date?2011-1-17?下午06:58:05 ??*?@version?1.0 ?
  4. ?*/??@Entity(noClassnameStored=true) ??
  5. public?class?StoredSeqence?implements?Serializable?{ ????
  6. ????private?static?final?long?serialVersionUID?=?1L; ????
  7. ????@Id??????String?collName; ??
  8. ??????Long?value; ??
  9. ???? ????
  10. ????public?StoredSeqence(){ ?????????? ??
  11. ????} ?????? ??
  12. ????public?StoredSeqence(String?collName)?{ ??????????this.collName?=?collName; ??
  13. ????} ????
  14. ????public?Long?getValue()?{ ??????????return?value; ??
  15. ????} ????
  16. ????public?void?setValue(Long?value)?{ ??????????this.value?=?value; ??
  17. ????} ????
  18. ????public?String?getCollName()?{ ??????????return?collName; ??
  19. ????} ????
  20. ????public?void?setCollName(String?collName)?{ ??????????this.collName?=?collName; ??
  21. ????} ????
  22. ???? ????
  23. ???? ??} ??

然后定义一个实体的基类,在基类中处理主键生成。

java?代码
  1. /** ??*?自增长数字类型主键的Mongo实体 ?
  2. ?*? ??*?@author?yongtree ?
  3. ?*?@date?2011-1-17?下午04:11:04 ??*?@version?1.0 ?
  4. ?*/??public?abstract?class?LongPKMongoEO?extends?BaseMongoEO?{ ??
  5. ??????@Id??
  6. ????Long?_id; ????
  7. ????@Transient??????protected?Datastore?ds; ??
  8. ???? ?????? ??
  9. ??????public?void?setDs(Datastore?ds)?{ ??
  10. ????????this.ds?=?ds; ??????} ??
  11. ??????@PrePersist??
  12. ????void?prePersist()?{ ?????????? ??
  13. ????????//自增性主键的处理 ?????????? ??
  14. ????????if?(_id?==?null)?{ ??????????????String?collName?=?ds.getCollection(getClass()).getName(); ??
  15. ????????????Query<StoredSeqence>?q?=?ds.find(StoredSeqence.class,?"_id", ??????????????????????collName); ??
  16. ????????????StoredSeqence?ss?=?q.get(); ??????????????if(ss==null){//不存在该实体的注册,则新创建一个 ??
  17. ????????????????ss?=?new?StoredSeqence(collName); ??????????????????ss.setValue(1l); ??
  18. ????????????}else{ ??????????????????ss.setValue(ss.getValue()+1); ??
  19. ????????????} ??????????????ds.save(ss); ??
  20. ????????????_id=ss.value; ??????????} ??
  21. ????} ????
  22. ????public?Long?getId()?{ ??????????return?_id; ??
  23. ????} ????
  24. }??



这样自增长主键的生成的主要功能基本上已经完成了,具体如何使用,接下来将根据实际的项目再做介绍,请继续关注我的博客。

?

原文:http://www.po-soft.com/hi/yongtree/blog/2157

热点排行