标签:
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 代码
/**
* 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;
}
}
这样自增长主键的生成的主要功能基本上已经完成了,具体如何使用,接下来将根据实际的项目再做介绍,请继续关注
我的博客。附件:
LongPKMongoEO.javaStoredSeqence.java旧一篇:架构设计之–Don’t Repeat Yourself |
新一篇:敏捷开发:拥抱变化的产品开发流程
本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请
点击举报。