在过去的几年中, NoSQL数据库(例如CouchDB,Cassandra和MongoDB)在不需要运行传统RDBMS的语义和开销的应用程序中得到了普及。 我不会进入选择NoSQL数据库的设计决策,因为其他人已经做得很好,但是我将结合我在MongoDB上的经验以及在Java中有效使用它的一些技巧。

最近,我有机会使用MongoDB (与humongoous一样),这是一个用C ++编写的面向文档的数据库。 它是存储结构可能不同的文档的理想选择,它使用类似于JSON的格式,这意味着它支持与JSON类似的数据类型和结构。 它提供了丰富而简单的查询语言,仍然使我们能够为快速检索的关键字段建立索引。 文档存储在集合中,这有效地限制了查询的范围,但是对于可以存储在集合中的异构数据的类型实际上没有任何限制。 如果您需要学习MongoDB的基础知识,则MongoDB站点上的文档不错。

Java中的MongoDB

Mongo Java驱动程序基本上将所有文档公开为键值对(显示为map和值列表)。 这意味着,如果必须使用Java存储或检索文档,则必须将POJO映射到该映射接口。 以下是通常需要编写的代码类型示例,以将文档从Java保存到MongoDB:

BasicDBObject doc = new BasicDBObject();doc.put("user", "carfey");BasicDBObject post1 = new BasicDBObject();
post1.put("subject", "spam & eggs");
post1.put("message", "first!");BasicDBObject post2 = new BasicDBObject();
post2.put("subject", "sorry about the spam");doc.put("posts", Arrays.asList(post1, post2));coll.insert(doc);

对于某些用例来说这很好,但是对于其他用例来说,最好有一个库来为我们做繁琐的工作。

输入Morphia

Morphia是一个Java库,其行为类似于MongoDB的ORM –它使我们能够将Java对象无缝映射到MongoDB数据存储。 它使用注释来指示类存储在哪个集合中,甚至支持多态集合。 最好的功能之一是,它可以用于基于集合或属性级别的注释自动为集合建立索引。 这极大地简化了部署和推出变更。

我提到了同一集合中多种类型的多态存储。 这可以帮助我们映射不同的文档结构,并在某种程度上像Hibernate之类的鉴别器 。

这是一个示例,说明如何定义支持多态存储和查询的实体。 Return类是Order的子级,并引用相同的collection-name。 查询或存储数据时,Morphia将自动处理多态性。 对于非多态的集合,您几乎会做同样的事情,但是不会有多个使用相同集合名称的类。

注意:这实际上不是我建议存储在MongoDB中的数据类型的示例,因为它更适合于传统的RDBMS,但是很好地展示了原理。

@Entity("orders") // store in the orders collection
@Indexes({ @Index("-createdDate, cancelled") }) // multi-column index
public class Order {@Id private ObjectId id; // always required@Indexedprivate String orderId;@Embedded // let's us embed a complex objectprivate Person person;@Embeddedprivate List<Item> items;private Date createdDate;private boolean cancelled;// .. getters and setters aren't strictly required// for mapping, but they would be here
}@Entity("orders") // note the same collection name
public class Return extends Order {// maintain legacy name but name it nicely in mongodb@Indexed@Property("rmaNumber") private String rma;private Date approvedDate;private Date returnDate;
}

现在,在下面,我将演示如何查询那些多态实例。 请注意,存储数据时我们不必做任何特殊的事情。 MongoDB将className属性与文档一起存储,因此它可以支持多态获取和查询。 按照上面的示例,我可以通过执行以下查询所有订单类型:

// ds is a Datastore instance
Query<Order> q = ds.createQuery(Order.class).filter("createdDate >=", date);
List<Order> ordersAndReturns = q.asList();// and returns only
Query<Return> rq = ds.createQuery(Return.class).filter("createdDate >=", date);
List<Return> returnsOnly = rq.asList();

如果我只想查询普通订单,则必须使用className过滤器,如下所示。 这使我们能够有效地禁用多态行为并将结果限制为单个目标类型。

Query<Order> q = ds.createQuery(Order.class).filter("createdDate >=", cutOffDate).filter("className", Order.class.getName());List<Order> ordersOnly = q.asList();

Morphia当前使用className属性来过滤结果,但是在将来的某个时候可能会使用一个鉴别符列,在这种情况下,您可能不得不过滤该值。

注意:在应用程序启动期间的某个时刻,您需要注册映射的类,以便Morphia可以使用它们。 详细信息请参见此处。 下面是一个简单的示例。

Morphia m = ...
Datastore ds = ...m.map(MyEntity.class);
ds.ensureIndexes(); //creates all defined with @Indexed
ds.ensureCaps(); //creates all collections for @Entity(cap=@CappedAt(...))

文档结构变化问题

MongoDB中面向文档的存储的一个不错的功能之一是,它允许您将具有不同结构的文档存储在同一集合中,但是仍然可以执行结构化查询和索引值以获得良好的性能。

不幸的是,Morphia并不真正喜欢这种方式,因为它旨在将所有存储的属性映射到已知的POJO字段。 目前,我发现有两种方法可以让我们处理此问题。

第一个是禁用查询验证。 这意味着将删除数据存储中存在但无法映射到我们的POJO的值,而不是将其炸掉:

// drop unmapped fields quietly
Query<Order> q = ds.createQuery(Order.class).disableValidation();

另一个选择是使用地图将所有非结构化内容存储在单个存储桶元素下。 它可以包含MongoDB驱动程序支持的任何基本类型,包括列表和地图,但不包含复杂对象,除非您已向Morphia注册了转换器(例如morphia.getMapper()。getConverters()。addConverter(new MyCustomTypeConverter()))。

@Entity("orders")
public class Order {// .. our base attributes hereprivate Map<String, Object> attributes; // bucket for everything else (
}

请注意,Morphia可能会在启动时抱怨它无法验证字段(因为泛型声明不严格),但是从当前发行版(0.99)开始,它将正常工作并可以正常存储任何属性并检索它们作为值的映射和列表。

注意:当它从检索到的文档中填充一个松散类型的映射时,它将使用基本的MongoDB Java驱动程序类型BasicDBObject和BasicDBList。 它们分别实现Map和List,因此它们将与您期望的一样工作,只是它们与您可能存储的任何输入映射或列表都不相等(即使结构和内容看起来相等)。 如果要避免这种情况,可以使用@PostLoad注释来注释一个方法,该方法可以在文档加载后对JDK映射和列表执行规范化。 我个人这样做是为了确保始终看到MongoDB文档的一致视图,无论它们是从集合中提取还是尚未持久化。

参考: Carfey Software博客上的JCG合作伙伴提供的将MongoDB与Morphia结合使用的信息 。

相关文章 :

  • Cassandra,MongoDB,CouchDB,Redis,Riak,HBase比较
  • Java Code Geeks Andygene Web原型
  • Java教程和Android教程列表
  • 每个程序员或架构师都应该知道的9 + 7件事

翻译自: https://www.javacodegeeks.com/2011/11/using-mongodb-with-morphia.html

将MongoDB与Morphia结合使用相关推荐

  1. MongoDB的Morphia框架

    Morphia是一个开放源代码的对象关系映射框架,它对MongoDB数据库 java版驱 动进行了非常轻量级的对象封装,使得Java程序员可以随心所欲的使用对象编程思维来操纵MongoDB数据库,也让 ...

  2. NoSQL 之 Morphia 操作 MongoDB

    上两篇文章:http://www.cnblogs.com/hoojo/archive/2011/06/01/2066426.html http://www.cnblogs.com/hoojo/arch ...

  3. Morphia - mongodb之ORM框架

    一.简介 二.注解 1.@Entity 2.@Id 3.@Indexed 4.@Embedded 5.@Transient和@Property 6.@Reference 三.示例 四.参考资料 Mor ...

  4. mvvm 耗时加载进度条_ZK的实际应用:MVVM –加载和渲染数据

    mvvm 耗时加载进度条 先前的文章简要介绍了RIA框架ZK,以及其CSS Selector启发的控制器机制如何通过使在控制器类中引用UI组件的任务变得相对灵活来减轻UI更改所带来的一些负担. 然后, ...

  5. ZK的实际应用:MVVM –加载和渲染数据

    先前的文章简要介绍了RIA框架ZK,以及它CSS Selector启发式控制器机制如何通过使在控制器类中引用UI组件的任务变得相对灵活来减轻UI更改所带来的一些负担. 然后,我们在上一篇文章中探讨了Z ...

  6. Morphia和MongoDB:不断发展的文档结构

    在上一篇有关Morphia的文章中 ,我介绍了一些典型用法,并提到了一些已知问题的警告和解决方法. 我展示了使用Morphia多么容易,以及它与Java世界的交互方式. 为了跟进该帖子,我将讨论如何处 ...

  7. mongodb morphia

    原文:http://www.blogjava.net/watchzerg/archive/2012/09/20/388109.html 快速开始: @Entity public class Hotel ...

  8. MongoDB+java+spirng+morphia

    MongoDB+java+spirng+morphia Hotle.java packagetest_yu.morphiaSpring;importcom.google.code.morphia.an ...

  9. 使用 Morphia 和 MongoDB 实现持久化

    直接来一个简单的demo: 新建一个maven java project(maven-archetype-quickstart): DBHelper: package com.mongo.dao;im ...

最新文章

  1. 常见浏览器兼容性问题及解决方案
  2. gitee提交代码_git 版本控制,github和gitee
  3. 经典面试题SALES TAXES思路分析和源码分享
  4. android 隐藏输入法时自动关闭弹窗,Android监听输入法弹窗和关闭的实现方法
  5. 本田da屏怎么进wince系统_谁说思域要停产的?打脸来得不是一般的快 第十一代本田思域Prototype...
  6. Ajax 登录控件(三)
  7. Eclipse用SVN上传新项目
  8. 游戏模型提取_腾讯手Q游戏中心的个性化推荐实战
  9. 使用discuz搭建bbs论坛网站
  10. 大学概率论终极复习攻略
  11. 拉依达准则去除异常数据
  12. 【深度学习】深度学习基础-Warm_up训练策略
  13. 嵌入式开发工具集合及资料(转载)
  14. 机器学习实战一:泰坦尼克号生存预测 Titantic
  15. PrimeVue - 基于 Vue 3 的免费开源、定制性强的前端 UI 组件库
  16. gdal geometry java_GDAL Geometry对象操作 - 创建对象
  17. android软件工程师应具备的素养
  18. PTA——重要的话说三遍
  19. [BZOJ4808] 马(最大独立集,最大流)
  20. 学成在线 课程列表 页面

热门文章

  1. 数据结构和算法的基本概念
  2. 如何导入数据模板到MVC
  3. java插入排序_Java程序要插入排序
  4. java设计模式 订阅模式_Java中的复合设计模式
  5. 视图中::text_新CalendarFX视图:MonthGridView!
  6. swarm部署集群_WildFly Swarm –将Java EE应用程序部署为独立的Jar
  7. java launcher_JAR清单类路径不仅适用于Java Application Launcher
  8. jooq和jdbc_将jOOQ与JDBC比较
  9. 具有InlfuxDB的Spring Boot和Micrometer第1部分:基础项目
  10. apache hive_Hive:使用Apache Hive查询客户最喜欢的搜索查询和产品视图计数