阅读更多

7顶
1踩

开源软件

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  体验下。

 

7
1
评论 共 14 条 请登录后发表评论
14 楼 linliangyi2007 2013-03-18 15:25
allwefantasy 写道
linliangyi2007 写道
看到extends 这个关键字出现在java bean这个层面,
武断的说一句,这个框架不太成功!!

java bean在业务上通过extends的例子是大量存在的,而java偏偏是一个单继承语言

ODM这种使用annotation实现,会远好过继承式的充血模型,这点在我个人经历的项目中屡试不爽!


传说,这个已经不是 JavaBean了。它是Model....

你这里说的Model是指纯DAO么?

通常我们在MVC中说的Model,我个人理解是业务领域模型-即我们通常说的Bean和它们对应的数据逻辑。
我在你的代码中看到了
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;  //这里是我们通常理解的Bean属性
    private String body;   //这里也是我们通常理解的Bean属性
}  


那么,如果Article这个类需要继承Text这个类,同时要使用你这个框架怎么办?
13 楼 allwefantasy 2013-03-18 09:31
linliangyi2007 写道
看到extends 这个关键字出现在java bean这个层面,
武断的说一句,这个框架不太成功!!

java bean在业务上通过extends的例子是大量存在的,而java偏偏是一个单继承语言

ODM这种使用annotation实现,会远好过继承式的充血模型,这点在我个人经历的项目中屡试不爽!


传说,这个已经不是 JavaBean了。它是Model....
12 楼 linliangyi2007 2013-03-08 15:40
看到extends 这个关键字出现在java bean这个层面,
武断的说一句,这个框架不太成功!!

java bean在业务上通过extends的例子是大量存在的,而java偏偏是一个单继承语言

ODM这种使用annotation实现,会远好过继承式的充血模型,这点在我个人经历的项目中屡试不爽!
11 楼 allwefantasy 2013-03-06 21:33
敲代码的小北 写道
nosql 能否发展为产业支柱??你们怎么看

各有使用场景。
10 楼 allwefantasy 2013-03-06 21:33
finallygo 写道
allwefantasy 写道
suyulin6688 写道
要超越 Spring Data MongoDB 子项目?


谈不上超越。我的哲学就是要用起来自然,简单,方便。所以希望MongoMongo能实现这一点。

感觉http://jongo.org/ 这个更加的简单也更加原生态...


很有意思的一个项目,不过这种纯字符串的,估计还是会比较蛋疼的。核心在于java不支持{} hash 语法和 [] 数组(链表语法)。不过我更倾向于利用不定参数以及静态导入来实现类似语法的,比如 map("name","jack","address":list("BeiJing","NewYork")),也算是简洁一些了。
9 楼 敲代码的小北 2013-03-06 20:59
nosql 能否发展为产业支柱??你们怎么看
8 楼 finallygo 2013-03-06 20:38
allwefantasy 写道
suyulin6688 写道
要超越 Spring Data MongoDB 子项目?


谈不上超越。我的哲学就是要用起来自然,简单,方便。所以希望MongoMongo能实现这一点。

感觉http://jongo.org/ 这个更加的简单也更加原生态...
7 楼 white_crucifix 2013-03-06 18:05
名字读起来很有爱啊~
6 楼 allwefantasy 2013-03-06 13:05
ray_linn 写道
一看  extends 就烦,单根继承,凭啥你就给占了。

嗯 是的。很多人都这么觉得,不过大部分情况是你不会受到extends的影响。如果你需要继承来复用代码,建议使用代理(delegate)方式。 相对来说,extends Document 带来的好处可能会更多,那为什么不用呢。 当然,部分人是对这种extends比较讨厌的,那就没办法了,那么可以使用morphia,spring data mongodb 等,这个时候,他们可能更适合些。
5 楼 ray_linn 2013-03-06 12:46
一看  extends 就烦,单根继承,凭啥你就给占了。
4 楼 allwefantasy 2013-03-06 11:33
wxq594808632 写道
我们一直用的这个 https://code.google.com/p/morphia/


5 steps to run a application on MongoMongo

可以花几分钟体验下,然后和morphia 做个对比。
3 楼 wxq594808632 2013-03-06 11:15
我们一直用的这个 https://code.google.com/p/morphia/
2 楼 allwefantasy 2013-03-06 10:06
suyulin6688 写道
要超越 Spring Data MongoDB 子项目?


谈不上超越。我的哲学就是要用起来自然,简单,方便。所以希望MongoMongo能实现这一点。
1 楼 suyulin6688 2013-03-06 09:45
要超越 Spring Data MongoDB 子项目?

发表评论

您还没有登录,请您登录后再发表评论

相关推荐

  • 对于人机结合+人工智能的一点思考

    最近看了不少人机结合的论文,总结一小下

  • 如何引导机器?如何面临人机结合?《​人工智能与人类未来》

    [微信公众号 乐生活与爱]公众号曾转载过蔡恒进教授的奇文|意识如何演化?机器何时有自我意识?《附着与隧通-心智的工作模式》,值得反复也读。我上周听了由北京大学博古睿研究中心、中国人民大学哲学院、中国人民大学哲学与认知科学交叉平台、服务器艺术联合主办的“贞下起元:真实之虚幻 虚拟之现实”论坛,尤其是朱嘉明和段永朝等老师的演讲,引起了我的思考和问题:我们该如何面临将要到来的人...

  • Gartner报告:人机结合的增强智能将成为AI最有价值的应用

    点击链接:http://stratifyd.mikecrm.com/6UsDolj,查看Gartner关于增强智能的解读报告全文,了解增强智能的应用场景和对人类生活的改变。 Gartner预测,随着人工智能技术的发展,增强智能(结合了人类和AI的能力)将为人类生活带来颠覆性变革。企业应当最大限度地利用增强智能去扩充人类的智力和能力,将人机结合的增强智能应用于社会实践,帮助人类快速高效地解决更多复杂问题。 Gartner报告要点提炼: 1. 说到人工智能(AI),人们首先想到的是机器学习、自然语言处

  • 人工智能+人机融合

    1、群体智能 https://mp.weixin.qq.com/s/XkqoRdM0AGiS_sM6tPwJUA 基于群体编辑的维基百科、基于群体开发的开源软件、基于众问众答的知识共享、基于众筹众智的万众创新、基于众包众享的共享经济等等。 《规划》提出的群体智能研究方向,实质上正是综合集成研讨厅在人工智能新时代的拓展和深化。它的研究内涵不单是关注精英专家团体,而是通过互联网组织结构和大数据驱

  • 人机的智能混合

    (2013年夏摄于剑桥郡格兰切斯特苹果园)一、智能智能不是算是法,是融合元素关系事实事物的法。智能有点像医学,既不是数学,也不是科学。时至今日,智能仍没有统一公认的定义,未来依然也不会有!用数学和科学表示出来的都是人工智能,也是不完善的简化智能。智能是人物(机)环境系统交互的产物,她是人文艺术、科学技术、道德伦理、宗教信仰、风俗习惯等诸多领域共同孕育而出的产物(We know it when we

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

    MongMongo是一个用Java写的ODM框架,使得对MongoDB的操作更加便捷。   MongoMongo努力为Java开发者提供类似于ActiveORM 或者 Hibernate的操作API,并且保留了MongoDB的schemaless,document-based 设计,动态查询,...

  • PHP基于mongodb框架,PHP与MongoDB:类库、框架与工具介绍

    本文来自官方,文中把PHP与相关的类库、框架、工具做了汇总和介绍,如果你正使用PHP并在关注,那么这篇...这里专门有一篇介绍CakePHP框架如何使用MongoDB存储的文章:Using MongoDb with CakePHPCodeigniterCodeIgn...

  • MongoDB快速上手

    MongoDB简单快速上手

  • 在Python中使用MongoDB

    在我们的《MongoDB定义指南》中,我们涵盖了很多基础。在这里,您可以获得有关NoSQL数据库,它们是什么,如何使用它们以及使用它们的好处的更多信息。除此之外,您还可以找到有关不同类型的NoSQL数据库及其最受欢迎...

  • 仓没加错:Node.js+MongoDB替你管理投资仓位

    有人说,控制仓位的水平,决定了你是一个炒股新手还是民间股神。这句话还真有几分道理。因为仓位管理是交易风险管理的基础,所以资产规模越大的...在数据库层面,我们选择MongoDB来存储所有的仓位记录。 基本架构...

  • 如何理解定义大脑?道翰天琼认知智能机器人平台API接口大脑为您揭秘。

    如何理解定义大脑?道翰天琼认知智能机器人平台API接口大脑为您揭秘。 城市大脑是互联网大脑架构与智慧城市建设结合的产物,是城市级的类脑复杂智能巨系统,在人类智慧和机器智能的共同参与下,在物联网,大数据,人工智能,边缘计算,5G、云机器人、数字孪生等前沿技术的支撑下,城市神经元网络和城市云反射弧将是城市大脑建设的重点,城市大脑的作用是提高城市的运行效率,解决城市运行中面临的复杂问题,更好的满足城市各成员的不同需求。城市大脑的发展目标不仅仅局限在一个城市或一个地区,当世界范围的城市大脑连接在一起,城市大脑最终

  • 有关军事人机混合智能的几点思考

        很多军事智能的博弈是非纳什均衡的,纳什均衡是博弈论的一个基本概念:如果一场博弈中的每一个主体都采取最佳的可能策略,并且将其他主体的策略都考虑在内,以至于任何一个主...

  • 为什么说人机融合智能是强人工智能?

    一     智能是什么?人具有智能的一部分,而不是全部。    智能是东西方文明一直共同关注的对象,孟子曰:“是非之心,智也”(《告子上》);米塞斯说:区别A与非A即是知...

  • 集合、集合的顶层接口Collection、迭代器接口、迭代器遍历集合

    集合 集合的特点 集合只能存储对象(引用类型),集合长度可变。集合可以存储不同类型的对象。 java提供了多种集合类。 集合的集成体系 体系老大:Collection 自上至下从抽象到具体,最底层是具体的类。 Collection——集合的顶层接口 Collection的功能...

  • 结合MongoDB开发LBS应用(mongodb geo)

    我所在的项目也正从事相关系统的开发,我们使用的是Symfony2+Doctrine2 ODM+MongoDB的组合。我们将这些技术要点整理成文,希望能够通过本文的介绍和案例,详细解释如何使用MongoDB进行地理位置信息的查询和处理。在...

  • Mongoengine:驾驭MongoDB数据的利器

    ORM框架主要用于简化与数据库的交互,特别是在复杂数据模型和大量数据的情况下。ORM框架通过使用面向对象编程的方式来处理数据库记录,提供了对数据库的高级别抽象,消除了很多手动编写SQL语句的需求。

  • 结合MongoDB开发LBS应用

    我所在的项目也正从事相关系统的开发,我们使用的是Symfony2+Doctrine2 ODM+MongoDB的组合。 我们将这些技术要点整理成文,希望能够通过本文的介绍和案例,详细解释如何使用MongoDB进行地理位置信息的查询和处理。...

  • MongoDB资料大全

    摘要: 为了帮助大家进一步...MongoDB是一个开源的、基于分布式的、面向文档存储的非关系型数据库。是非关系型数据库当中功能最丰富、最像关系数据库的。MongoDB由C++编写, MongoDB可以运行在Windows、unix、OS...

  • 将js进行到底:node学习9

    node.js数据库篇——Mongoose ODM 介绍mongoose 几乎所有的语言都有原生数据库连接驱动,这个我们上一回已经了解了,比如java的jdbc,...为此,ORM,ODM诞生了,他们简化了数据库操作,将操作打包成简单的方法,...

  • 自然语言处理讲义

      1.综述.1.1. 绪论.1.1.1. 背景,目标.1.1.1.1. 研究自然语言的动力1. 语言是思维的裁体,是人际交流的重要工具。在人类历史上以语言文字形式记载和流传的知识占到知识总量的80%以上。就计算机的应用而言,据统计用于数学计算的仅占10%,用于过程控制的不到5%,其余85%左右都是用于语言文字的信息处理。在这样的社会需求下,自然语言理解作为语言信息处理技术的一个高层次的重要方向,

Global site tag (gtag.js) - Google Analytics