Mongodb 从增ID实现及原理分析

Mongodb 自增ID实现及原理分析

研究发现,mongodb完全可以实现自增ID,并且Morphia已经对此做了封装,并且使用起来也非常方便,只需让你的entity继承自LongIdEntity。

下面给出一段entity示例代码如下:

 

@EntitypublicclassUserextendsLongIdEntity{publicstaticfinalString DBNAME ="myds";publicUser(){super(MongoManager.getDatastore(DBNAME));}privateString username;privateString password;privateint age;//---get set---}

DAO类及测试代码如下:

 

 

publicclassUserDAOextendsBasicDAO<user, long="">{publicUserDAO(){super(User.class,MongoManager.getMongo(),MongoManager.getMorphia(),User.DBNAME);}publicstaticvoid main(String[] args){User user =newUser();
    user.setPassword("123456");
    user.setUsername("lamfire");
    user.setAge(100);UserDAO dao =newUserDAO();Keykey= dao.save(user);System.out.println(user.getUsername()+" ID:"+ key.getId());

    user =newUser();
    user.setPassword("abc123");
    user.setUsername("hayash");
    user.setAge(99);

    key = dao.save(user);System.out.println(user.getUsername()+"ID:"+ key.getId());}}

运行结果输出为:

 

lamfire ID:1
hayash ID:2

实验证明,这个自增ID已经生效。并且在“myds”库下新增了表"ids",并且表里有一行记录存储了User表对应的自增ID的值,每调用一次该值就被自动加一。

下面,我们再来看看LongIdEntity干了什么事,如何实现的自增呢?里面的核心代码片段如下(关键位置我添加了注释):

String collName = ds.getCollection(getClass()).getName();Queryq= ds.find(StoredId.class,"_id", collName);//跟据表名查询UpdateOperationsuOps= ds.createUpdateOperations(StoredId.class);
uOps.inc("value");//指定了将"value"递增操作StoredId newId = ds.findAndModify(q, uOps);//执行查询并更新,该操作椐有原子性if(newId ==null){
   newId =newStoredId(collName);
   ds.save(newId);}
myLongId = newId.getValue();