MongMongo是一个用Java写的ODM框架,使得对MongoDB的操作更加便捷。
MongoMongo努力为Java开发者提供类似于ActiveORM 或者 Hibernate的操作API,并且保留了MongoDB的schemaless、document-based 设计、动态查询、原子修改操作等特性。当然你可以很方便的绕开MongoMongo而使用Java Driver 原生提供的功能。
下面是一段示例代码:
public class Blog extends Document { static { storeIn("blogs"); hasManyEmbedded("articles", new Options(map( Options.n_kclass, Article.class ))); //create index index(map("blogTitle", -1), map(unique,true)); //validate uerName field validate("userName",map(length,map( minimum,5 ))); } //association related public AssociationEmbedded articles() {throw new AutoGeneration();} private String userName; private String blogTitle; } public class Article extends Document { static { belongsToEmbedded("blog", new Options(map( Options.n_kclass, Blog.class ))); } public AssociationEmbedded blog() {throw new AutoGeneration();} private String title; private String body; } public class Usage{ public static void main(String[] args){ Blog blog = Blog.where(map("userName","sexy java")).in(map("id",list(1,2,3))).singleFetch(); blog.articles().build(map("title","i am title","body","i am body")); blog.save(); } }
我们可以看到这是一个典型的充血模型。关联、存储、创建索引、设置别名等操作都简单的在static 块中调用一个函数即可实现。如果你用一些动态语言,你会发现这种方法级声明语法是非常流行,写起来也非常舒服。
因为MongoDB是schemaless的,所以MongoMongo将所有数据操作和维护都放在模型类中,你可以对所有的数据字段,索引情况一目了然。当然schemaless带来的好处是你不用再维护data migration了。
其实对于MongoDB相关的框架已经有很多,那么MongoMongo的优势何在?我们简单做个代码对比就一目了然了。
以 SpringData for MongoDB为例,典型的操作如下:
public static void main( String[] args ) { MongoOperations mongoOps = new MongoTemplate(new Mongo(), "mydb"); Person person = new Person(); person.setName("Joe"); person.setAge(10); mongoOps.insert(person); log.info(mongoOps.findOne(new Query(Criteria.where("name").is("Joe")), Person.class)); }
事实上大部分Java ODM都是如此操作Model的。为了构造查询串引入Criteria对象,为了进行查询引入Query对象,查询时还要申明Person对象等。
此外对于索引、别名、校验等设置也较为繁琐和不清晰,比如将这些信息放在字段的Annotation上,或者设置一些Configuration对象等。
而MongoMongo将大部分对collection的配置都放在Model的代码块中,清晰明了,且便于管理。
相应的MongoMongo代码:
public static void main( String[] args ) { Person person = Person.create(map("name","Joe","age",34)); person.save(); log.info(Person.where(map("name","Joe")).singleFetch()); }
MongoMongo的查询也是典型的ORM的操作方式:
Blog blog = Blog.where(map("active",true)).in(map("id",list(1,2,3))).singleFetch();
通常你还可以写成:
public class Blog extends Document { public Criteria active(){ return where(map("active",true)); } }
之后你就可以这样调用:
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 体验下。
14 楼 linliangyi2007 2013-03-18 15:25
武断的说一句,这个框架不太成功!!
java bean在业务上通过extends的例子是大量存在的,而java偏偏是一个单继承语言
ODM这种使用annotation实现,会远好过继承式的充血模型,这点在我个人经历的项目中屡试不爽!
传说,这个已经不是 JavaBean了。它是Model....
你这里说的Model是指纯DAO么?
通常我们在MVC中说的Model,我个人理解是业务领域模型-即我们通常说的Bean和它们对应的数据逻辑。
我在你的代码中看到了
那么,如果Article这个类需要继承Text这个类,同时要使用你这个框架怎么办?
13 楼 allwefantasy 2013-03-18 09:31
武断的说一句,这个框架不太成功!!
java bean在业务上通过extends的例子是大量存在的,而java偏偏是一个单继承语言
ODM这种使用annotation实现,会远好过继承式的充血模型,这点在我个人经历的项目中屡试不爽!
传说,这个已经不是 JavaBean了。它是Model....
12 楼 linliangyi2007 2013-03-08 15:40
武断的说一句,这个框架不太成功!!
java bean在业务上通过extends的例子是大量存在的,而java偏偏是一个单继承语言
ODM这种使用annotation实现,会远好过继承式的充血模型,这点在我个人经历的项目中屡试不爽!
11 楼 allwefantasy 2013-03-06 21:33
各有使用场景。
10 楼 allwefantasy 2013-03-06 21:33
谈不上超越。我的哲学就是要用起来自然,简单,方便。所以希望MongoMongo能实现这一点。
感觉http://jongo.org/ 这个更加的简单也更加原生态...
很有意思的一个项目,不过这种纯字符串的,估计还是会比较蛋疼的。核心在于java不支持{} hash 语法和 [] 数组(链表语法)。不过我更倾向于利用不定参数以及静态导入来实现类似语法的,比如 map("name","jack","address":list("BeiJing","NewYork")),也算是简洁一些了。
9 楼 敲代码的小北 2013-03-06 20:59
8 楼 finallygo 2013-03-06 20:38
谈不上超越。我的哲学就是要用起来自然,简单,方便。所以希望MongoMongo能实现这一点。
感觉http://jongo.org/ 这个更加的简单也更加原生态...
7 楼 white_crucifix 2013-03-06 18:05
6 楼 allwefantasy 2013-03-06 13:05
嗯 是的。很多人都这么觉得,不过大部分情况是你不会受到extends的影响。如果你需要继承来复用代码,建议使用代理(delegate)方式。 相对来说,extends Document 带来的好处可能会更多,那为什么不用呢。 当然,部分人是对这种extends比较讨厌的,那就没办法了,那么可以使用morphia,spring data mongodb 等,这个时候,他们可能更适合些。
5 楼 ray_linn 2013-03-06 12:46
4 楼 allwefantasy 2013-03-06 11:33
5 steps to run a application on MongoMongo
可以花几分钟体验下,然后和morphia 做个对比。
3 楼 wxq594808632 2013-03-06 11:15
2 楼 allwefantasy 2013-03-06 10:06
谈不上超越。我的哲学就是要用起来自然,简单,方便。所以希望MongoMongo能实现这一点。
1 楼 suyulin6688 2013-03-06 09:45