每个MongoDB的document都有一个_id字段作为它的第一个属性,这个值通常是一个BSON对象id,因此,这个id对于集合中的每个成员都是唯一的,如果用户插入一个document没有提供一个id,数据库将自动生成一个id,并存储在_id字段。
TheBSONObjectIdDatatype
一个BSONObjectID是由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 代码
- /**
- * MongoDB自增长主键维护队列,类似于MSSQL,Oracle维护主键的方式
- *
- * @author yongtree
- * @date 2011-1-17 下午06:58:05
- * @version 1.0
- */
- @Entity(noClassnameStored=true)
- public class StoredSeqence implements Serializable {
-
- private static final long serialVersionUID = 1L;
-
- @Id
- String collName;
-
- Long value;
-
-
- public StoredSeqence(){
-
- }
-
- public StoredSeqence(String collName) {
- this.collName = collName;
- }
-
- public Long getValue() {
- return value;
- }
-
- public void setValue(Long value) {
- this.value = value;
- }
-
- public String getCollName() {
- return collName;
- }
-
- public void setCollName(String collName) {
- this.collName = collName;
- }
-
-
-
-
- }
然后定义一个实体的基类,在基类中处理主键生成。
java 代码
- /**
- * 自增长数字类型主键的Mongo实体
- *
- * @author yongtree
- * @date 2011-1-17 下午04:11:04
- * @version 1.0
- */
- public abstract class LongPKMongoEO extends BaseMongoEO {
-
- @Id
- Long _id;
-
- @Transient
- protected Datastore ds;
-
-
-
- public void setDs(Datastore ds) {
- this.ds = ds;
- }
-
- @PrePersist
- void prePersist() {
-
- //自增性主键的处理
-
- if (_id == null) {
- String collName = ds.getCollection(getClass()).getName();
- Query<StoredSeqence> q = ds.find(StoredSeqence.class, "_id",
- collName);
- StoredSeqence ss = q.get();
- if(ss==null){//不存在该实体的注册,则新创建一个
- ss = new StoredSeqence(collName);
- ss.setValue(1l);
- }else{
- ss.setValue(ss.getValue()+1);
- }
- ds.save(ss);
- _id=ss.value;
- }
- }
-
- public Long getId() {
- return _id;
- }
-
- }
这样自增长主键的生成的主要功能基本上已经完成了,具体如何使用,接下来将根据实际的项目再做介绍,请继续关注我的博客。
原文:http://www.po-soft.com/hi/yongtree/blog/2157