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

2019独角兽企业重金招聘Python工程师标准>>> hot3.png

每个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
/**   
 * 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;    
    }    
   
        
   
        
}

然后定义一个实体的基类,在基类中处理主键生成。
/**   
 * 自增长数字类型主键的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 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;    
    }    
   
}

转载于:https://my.oschina.net/yongtree/blog/93035

你可能感兴趣的:(为MongoDB增加自增长主键生成的功能)