MongoDB ODM 架構MongoMongo-簡化你的資料存放區

來源:互聯網
上載者:User

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  體驗下。

 

 

 

 

 

 

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.