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相關的架構已經有很多,那麼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 解決。
舉個例子:
TTUser.collection().find(new BasicDBObject("tagName","cool"));
這個時候你尅通過collection()方法獲得DBCollection對象。
當然也希望以後能遇到一個複雜的項目,從而能在該項目中完善MongoMongo.
如果你將它用在自己的項目中,我想肯定能節約相當多的代碼。
大家不妨根據 5 steps to run a application on MongoMongo 體驗下。