mongodb映射实体_MongoDB,Java和对象关系映射mongodb 映射实体
MongoDB简介
当今的NoSQL格局包括许多⾮常有能⼒的竞争者,它们以多种不同⽅式解决⼤数据问题。 这些竞争者之⼀就是功能强⼤的 。 MongoDB 是⼀种⾯向⽂档的⽆模式存储解决⽅案,使⽤JSON样式的⽂档来表⽰,查询和修改数据。
MongoDB有据可查,易于安装和设置,并且易于扩展。 它⽀持复制,分⽚,索引和映射/归约等熟悉的概念。 MongoDB开源社区⾮常庞⼤且活跃。 MongoDB拥有许多⼤型和⾼流量的⽣产部署,包括迪⼠尼,Craigslist,Foursquare,Github和SourceForge。
MongoDB是⼀个创建和维护的开源项⽬,该公司是由DoubleClick的前⾼管创建的。 除了出⾊的社区⽀持(10gen参与其中)之
外,10gen还提供商业⽀持。
MongoDB和NoSQL:陷阱和优势
MongoDB的优势在于它是⼀个⾮常易于接近的NoSQL解决⽅案。 当我第⼀次进⼊NoSQL数据库世界时,
我抽样了许多基于Java的解决⽅案,发现⾃⼰花了很多时间弄清楚什么是列族,Hadoop与HBase的关系以及ZooKeeper到底是什么? 当我最终弄清楚了所有内容后,还发现诸如Cassandra和HBase之类的产品显然是对NoSQL难题⾮常可靠且令⼈⿎舞的解决⽅案。 与其他解决⽅案相⽐,在开始编写代码之前,MongoDB易于掌握,需要克服的概念较少。
像任何软件⼀样,MongoDB显然并⾮没有缺陷。 在MongoDB期间,我遇到了⼀些我认为是“ Gotchas”的事情:
不要将其视为RDBMS。 这看起来似乎很明显,但是MongoDB使得创建和执⾏复杂的查询变得如此容易,以⾄于在尝试将其⽤于实时查询时,您可能会发现⾃⼰陷⼊了⿇烦,并遇到了性能问题。 ( )
MongoDB的索引是⼆进制树。 如果您不了解什么是b树,则可能应该 。 提供查询条件的顺序必须与创建索引的顺序匹配。
仔细设计索引。 这与上⾯的B树项⽬符号点相关。 我的前⼏个索引包含⽂档中的许多字段,您知道-“以防万⼀”我需要查询它们。 不要犯同样的错误。 我在⼀个很⼩的馆藏中(约1000万条记录)的索引之⼀增长到超过17GB,⽐馆藏本⾝还⼤。 如果数组字段将包含数百或数千个条⽬,则可能不希望对其进⾏索引。
MongoDB采⽤了⼀种⾮常有趣的⽅法来处理NoSQL。 它使⽤BSON进⾏存储,使⽤JSON进⾏表⽰,并使⽤JavaScript进⾏管理和Map / Reduce。 其结果是⼀样奇怪的⼩问题, (破等号运营商NumberLong)绑定,现在⼜突然出现,⽽MongoDB的年龄赶上了⽐较流⾏的⼤数据解决⽅案。
MongoDB,控制台和驱动程序
MongoDB的管理通常是使⽤JavaScript客户端控制台应⽤程序完成的,该应⽤程序使诸如数据迁移和操作之类的复杂任务变得轻⽽易举,并使⽤JavaScript编程语⾔进⾏了完全编程。 在本⽂中,我们将显⽰使⽤此控制台的⽰例。 如今,MongoDB社区将其称为驱动程序,提供了⽆数的⽣产质量的MongoDB客户。 通常,每种编程语⾔都有⼀个驱动程序,并且涵盖了所有流⾏的编程语⾔以及⼀些不太流⾏的语⾔。 本⽂介绍了如何将Java驱动程序⽤于MongoDB,并将其与使⽤ORM库(MJORM)进⾏⽐较。
引⼊MJORM:针对MongoDB的ORM解决⽅案
对象关系映射是解决NoSQL数据存储的最新趋势已带给应⽤程序程序员⽣命的众多有趣问题之⼀。 对象关系映射(ORM)是指将传统上存储在RDBMS中的持久数据映射到应⽤程序使⽤的对象。 这使得处理数据对于应⽤程序所使⽤的语⾔更加流畅和⾃然。
MongoDB的⾯向⽂档的体系结构⾮常适合ORM,因为它存储的⽂档本质上是对象本⾝。 不幸的是,没有可⽤于MongoDB的Java ORM 库很多,但有⼀些类似的例如和 (⽤于Spring Data伞项⽬的MongoDB实现)。
这些ORM库⼤量使⽤了注释,出于多种原因,这对我来说不是⼀个选择,其中最重要的是注释对象在许多项⽬中的可移植性。 这导致我启动了mongo-Java-orm或“ MJORM”(发⾳为me-yorm)项⽬; MongoDB的Java ORM。 MJORM是MIT许可的 。 该项⽬使⽤maven构建,并且maven⼯件存储库当前由google code subversion服务器托管。 在撰写本⽂时,MJORM的最新稳定发⾏版是0.15,并且在⽣产环境中有⼏个项⽬正在使⽤。
MJORM⼊门
将MJORM库添加到您的项⽬
Maven⽤户⾸先将MJORM maven存储库添加到其l⽂件中,以使MJORM⼯件可⽤于其项⽬:
<repository>
<id>mjorm-webdav-maven-repo</id>
<name>mjorm maven repository</name>
<url>lecode/svn/maven/repo/</url>
<layout>default</layout>
</repository>
然后依赖项本⾝:
<dependency>
<groupId&lecode</groupId>
<artifactId>mongo-Java-orm</artifactId>
<version>0.15</version>
</dependency>
这将使您能够在应⽤程序中导⼊和使⽤MJORM类。 如果您不使⽤maven,则需要⼿动下载MJORM库以及l中列出的依赖项。
创建您的POJO
现在已经有了相关性,是时候开始编写代码了。 我们将从Java POJO开始:
class Author {
private String firstName;
private String lastName;
// ... setters and getters ...
}
class Book {
private String id;
private String isbn;
private String title;
private String description;
private Author author;
// ... setters and getters ...
}
我们⽤该对象模型描述的是作者具有ID,名字和姓⽒,⽽书籍具有ID,ISBN号,标题,描述和作者。
您可能已经注意到,这本书的id属性是String ,这是为了容纳MongoDB的类型,该类型是⼀个12字节的⼆进制值,表⽰为⼗六进制字符串。 尽管MongoDB要求集合中的每个⽂档都具有唯⼀的ID,但并不要求ID的类型为ObjectId 。 当前,MJORM仅⽀持ObjectId类型的ID,并将其表⽰为String 。
您可能还已经注意到Author对象没有ID。 这是因为它将是Book⽂档的⼦⽂档,因此不需要ID。 请记住,MongoDB仅在集合中的根级别⽂档上需要ID。
创建XML映射⽂件
下⼀步是创建XML映射⽂件,MJORM将使⽤该映射⽂件将MongoDB⽂档映射到这些对象。 为了进⾏演⽰,我们将为每个对象创建⼀个⽂档,但是将所有映射放⼊单个XML⽂件或根据需要将它们分开是完全合理的。
这是l :
<?xml version="1.0"?>
<descriptors>
<object class="Author">
<property name="firstName" />
<property name="lastName" />
</object>
</descriptors>
并且: l :
<?xml version="1.0"?>
<descriptors>
<object class="Book">
<property name="id" id="true" auto="true" />
<property name="isbn" />
<property name="title" />
<property name="description" />
<property name="author" />
</object>
</descriptors>
映射⽂件很容易解释。 descriptors元素是根元素,并且必须存在于每个映射⽂件中。 在其下是object元素,这些object元素定义了要映射到MongoDB⽂档的每个类。 然后, object包含⼀些property元素,这些元素描述POJO上的所有属性以及它们如何映射到MongoDB⽂档上的属性。 property必须⾄少包含⼀个name元素,这是POJO上的属性名称和MongoDB⽂档上的属性名称。 可以选择添加column属性,以在MongoDB⽂档上指定备⽤属性名称。
具有id属性的property属性被视为对象的唯⼀标识符。 ⼀个object只能包含⼀个具有id属性的property元素。 auto属性告诉MJORM持久化该属性时,它应该⾃动为该属性⽣成⼀个值。
转到Google代码上的MJORM项⽬⽹站,以获取有关XML映射⽂件的更详细描述。
放在⼀起
现在,我们已经创建了数据模型并创建了映射⽂件,以告诉MJORM如何将POJO进出MongoDB进⾏编组和取消编组,我们可以从有趣的东西开始。 ⾸先,我们必须打开与MongoDB的连接:
Mongo mongo = new Mongo(
new MongoURI("mongodb://localhost/mjormIsFun")); // 10gen driver
Mongo对象来⾃于10gen的家伙编写的Java驱动程序。 本⽰例打开与本地MongoDB实例的连接,并使⽤mjormIsFun数据库。 接下来,我们创建MJORM ObjectMapper 。 当前,MJORM中可⽤的ObjectMapper接⼝的唯⼀实现是使⽤上述XML架构
的XmlDescriptorObjectMapper ,尽管MJORM的未来实现可能包括对注释或其他配置机制的⽀持。
XmlDescriptorObjectMapper objectMapper = new XmlDescriptorObjectMapper();
mapper.addXmlObjectDescriptor(new File("l"));
mapper.addXmlObjectDescriptor(new File("l"));
我们已经创建了XmlDescriptorObjectMapper并向其中添加了映射⽂件。 接下来,我们创建由MJORM提供的MongoDao对象的实例:
DB db = DB("mjormIsFun"); // 10gen driver
MongoDao dao = new MongoDaoImpl(db, objectMapper);
我们⾸先要做的是获取10gen驱动程序的DB对象的实例。 之后,我们创建我们的MongoDao为其提供DB对象和我们之前创建
的ObjectMapper 。 我们准备开始持久存储数据,让我们创建⼀Book并将其保存到MongoDB
Book book = new Book();
book.setIsbn("1594743061");
book.setTitle("MongoDB is fun");
book.setDescription("...");
book = ateObject("books", book);
System.out.Id()); // 4f96309f762dd76ece5a9595
⾸先,我们创建Book对象并进⾏填充,然后在MongoDao上调⽤createObject⽅法,并向MongoDao传递集合名称“ books ”和我们
的Book对象。 然后, DBObject使⽤我们之前创建的XML映射⽂件将Book变成DBObject (10gen的Java驱动程序使⽤的基础对象类型),并将新⽂档保存到“ books ”集合中。 然后,MJORM返回Book对象的实例,但是现在填充了它的id属性。 重要的是要注意,默认情况下,MongoDB不需要在使⽤数据库或集合之前创建数据库或集合。 它会在需要时创建它们,有时会导致混乱。 在MongoDB控制台中查看这本Book可能看起来类似于:
> db.books.find({_id:ObjectId("4f96309f762dd76ece5a9595")}).pretty()
{
"_id":          ObjectId("4f96309f762dd76ece5a9595"),
"isbn":        "1594743061",
"title":        "MongoDB is fun",
"description":  "..."
}
让我们看⼀下如果我们不使⽤MJORM⽽是直接使⽤10gen的Java驱动程序, createObject外观:
Book book = new Book();
book.setIsbn("1594743061");
book.setTitle("MongoDB is fun");
book.setDescription("...");
DBObject bookObj = BasicDBObjectBuilder.start()
.add("isbn",  Isbn())
.
add("title",  Title())
.add("description", Description())
.get();
// 'db' is our DB object from earlier
DBCollection col = db.getCollection("books");
col.insert(bookObj);
ObjectId id = ObjectId.class.("_id"));
System.out.StringMongod()); // 4f96309f762dd76ece5a9595
现在,我们可以查询对象:
Book book = adObject("books", "4f96309f762dd76ece5a9595", Book.class);
System.out.Title()); // "MongoDB is fun"
readObject⽅法通过其ID从给定的集合中读取⽂档,将其转换为适当的类(同样,使⽤前⾯的映射⽂件)并返回它。
⼀个精明的读者会发现我们的Book没有Author ,但它仍然存在。 这是由于MongoDB的⽆模式性质。 我们不能要求集合中的⽂档包含任何属性(_id属性除外),因此MongoDB完全可以创建没有Author的Book 。 让我们将Author添加到我们的书中并对其进⾏更新:
Author author = new Author();
author.setFirstName("Brian");
author.setLastName("Dilley");
book.setAuthor(author);
dao.updateObject("books", "4f96309f762dd76ece5a9595", book);
现在,我们的Book包含⼀个Author ,并保留在MongoDB中。 现在让我们在MongoDB控制台中查看我们的Book :
> db.books.find({_id:ObjectId("4f96309f762dd76ece5a9595")}).pretty()
{
"_id":          ObjectId("4f96309f762dd76ece5a9595"),
"isbn":        "1594743061",
"title":        "MongoDB is fun",
"description":  "..."
"author": {
"firstName": "Brian",
"lastName": "Dilley"
}
}
如您所见,我们保留的Book现在包含⼀个作者。 没有MJORM,这⼜是同样的事情:
Author author = new Author();
author.setFirstName("Brian");
author.setLastName("Dilley");
book.setAuthor(author);
DBObject bookObj = BasicDBObjectBuilder.start()java xml是什么
.add("isbn",  Isbn())
.add("title",  Title())
.add("description", Description())
.push("author")
.add("firstName",  FirstName())
.add("lastName",  LastName())
.
pop()
.get();
DBCollection col = db.getCollection("books");
col.update(new BasicDBObject("_id", ("_id")), bookObj);
对MongoDao提供的所有⽅法的深⼊描述超出了本⽂的范围。 敦促对在⾃⼰的项⽬中使⽤MJORM感兴趣的任何⼈查看MJORM项⽬提供的⽂档或它提供的MongoDao界⾯。
结论
希望本⽂引起了MongoDB和MJORM的兴趣。 MongoDB是⼀个出⾊的NoSQL数据存储,具有许多很棒的功能,并且肯定会存在很长时间。 如果最终在Java项⽬中使⽤它,那么您可能还会考虑使⽤MJORM库来满⾜您的ORM需求,如果是这样,则对任何功能请求,错误报告,⽂档或源代码补丁都将不胜感激!
作者简介
是⼀位经验丰富的⾼级⼯程师和团队负责⼈,拥有超过⼗三年的经验,专门研究Java / Java EE / Spring Framework / Linux内部和管理。 Brian在底层(0名以上员⼯)互联⽹创业公司,将他们推向市场以及构建/维护产品⽅⾯具有丰富的经验。 他是IaaS,云,PHP和Linux管理⽅⾯的专家,从采购,安装和配置产品以及企业硬件和软件基础结构(包括负载平衡,数据库,Web等)的采购,安装和配置。您可以在关注Brian。

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。