MongoDB ODM框架MongoMongo,简化你的数据存储

发布时间:2013-03-07作者: 邯郸翱翔

MongMongo是一个用Java写的ODM框架,使得对MongoDB的操作更加便捷。MongoMongo努力为Java开发者提供类似于ActiveORM或者 Hibernate的操作API,并且保留

MongMongo是一个用Java写的ODM框架,使得对MongoDB的操作更加便捷。

 

MongoMongo努力为Java开发者提供类似于ActiveORM 或者 Hibernate的操作API,并且保留了MongoDB的schemaless、document-based 设计、动态查询、原子修改操作等特性。当然你可以很方便的绕开MongoMongo而使用Java Driver 原生提供的功能。

 

下面是一段示例代码: 

 

Java代码 
  1. public class Blog extends Document {  
  2.     static {  
  3.         storeIn("blogs");                  
  4.         hasManyEmbedded("articles"new Options(map(  
  5.                 Options.n_kclass, Article.class  
  6.         )));  
  7.         //create index  
  8.         index(map("blogTitle", -1), map(unique,true));  
  9.         //validate uerName field  
  10.         validate("userName",map(length,map(  
  11.                 minimum,5  
  12.         )));  
  13.   
  14.     }  
  15.     //association related  
  16.     public AssociationEmbedded articles() {throw new AutoGeneration();}  
  17.     private String userName;  
  18.     private String blogTitle;  
  19. }  
  20.   
  21. public class Article extends Document {  
  22.     static {          
  23.         belongsToEmbedded("blog"new Options(map(  
  24.                 Options.n_kclass, Blog.class  
  25.         )));  
  26.     }  
  27.     public AssociationEmbedded blog() {throw new AutoGeneration();}  
  28.     private String title;  
  29.     private String body;  
  30. }  
  31.   
  32. public class Usage{  
  33.   public static void main(String[] args){  
  34.   
  35.      Blog blog = Blog.where(map("userName","sexy java")).in(map("id",list(1,2,3))).singleFetch();  
  36.      blog.articles().build(map("title","i am title","body","i am body"));  
  37.      blog.save();  
  38.   }  
  39.   
  40. }  

 

我们可以看到这是一个典型的充血模型。关联、存储、创建索引、设置别名等操作都简单的在static 块中调用一个函数即可实现。如果你用一些动态语言,你会发现这种方法级声明语法是非常流行,写起来也非常舒服。

 

因为MongoDB是schemaless的,所以MongoMongo将所有数据操作和维护都放在模型类中,你可以对所有的数据字段,索引情况一目了然。当然schemaless带来的好处是你不用再维护data migration了。

 

其实对于MongoDB相关的框架已经有很多,那么MongoMongo的优势何在?我们简单做个代码对比就一目了然了。

 

以 SpringData for MongoDB为例,典型的操作如下:

 

Java代码 
  1. public static void main( String[] args )  
  2.    {  
  3.        MongoOperations mongoOps = new MongoTemplate(new Mongo(), "mydb");  
  4.        Person person = new Person();  
  5.        person.setName("Joe");  
  6.        person.setAge(10);  
  7.        mongoOps.insert(person);  
  8.        log.info(mongoOps.findOne(new Query(Criteria.where("name").is("Joe")), Person.class));  
  9.    }  

  

事实上大部分Java ODM都是如此操作Model的。为了构造查询串引入Criteria对象,为了进行查询引入Query对象,查询时还要申明Person对象等。

 

此外对于索引、别名、校验等设置也较为繁琐和不清晰,比如将这些信息放在字段的Annotation上,或者设置一些Configuration对象等。

 

而MongoMongo将大部分对collection的配置都放在Model的代码块中,清晰明了,且便于管理。

 

相应的MongoMongo代码:

 

Java代码 
  1. public static void main( String[] args )  
  2.  {  
  3.      Person person =  Person.create(map("name","Joe","age",34));  
  4.      person.save();  
  5.      log.info(Person.where(map("name","Joe")).singleFetch());   
  6.  }  

 

MongoMongo的查询也是典型的ORM的操作方式:

 

Java代码 
  1. Blog blog = Blog.where(map("active",true)).in(map("id",list(1,2,3))).singleFetch();  

 

通常你还可以写成:

 

Java代码 
  1. public class Blog extends Document {  
  2.    public Criteria active(){  
  3.     return where(map("active",true));  
  4.    }   
  5. }  

 

之后你就可以这样调用:

 

Java代码 
  1. List<Blog> blogs = Blog.active().where(map("userName","jack")).fetch();  

 

复用性是很高的。

 

如果你使用过 ActiveORM,那么这样操作MongoDB 你会感觉很顺手。

 

MongoMongo目前在一些内部小项目中使用。根据需求定制的,所以相对来说没有 ActiveORM 完善,很多细节和功能没有考虑到,但是都可以通过其暴露的MongoDB Driver 解决。

 

当然也希望以后能遇到一个复杂的项目,从而能在该项目中完善MongoMongo。

 

如果你将它用在自己的项目中,我想肯定能节约相当多的代码。

 

大家不妨根据 5 steps to run a application on MongoMongo  体验下。

关于我们
翱翔简介
青鸟简介
诚聘精英
在线咨询
热门课程
BCSP软件开发专业
云计算专业
大数据专业
Web前端专业
java开发专业
翱翔就业
就业案例
翱翔荣誉
微信 公众号 在线咨询 免费课程