1. 概述
在这篇文章中,我们将探讨如何将流行的开源NoSQL数据库MongoDB与独立的Java客户端集成。
MongoDB是用C++编写的,它具有许多强大的特性,如map-reduce、自动分片、复制和高可用性等。
2. MongoDB
让我们先来看看MongoDB本身的一些关键点:
- 数据以类似JSON的文档存储,可以有各种结构。
- 使用动态模式,这意味着我们可以创建记录而无需预先定义。
- 记录的结构可以通过添加新字段或删除现有字段来简单地更改。
上述数据模型使我们能够轻松表示层次关系,存储数组和其他更复杂的结构。
3. 术语
理解MongoDB的概念会更容易,如果我们能将其与关系数据库结构进行比较。
让我们看看Mongo和传统MySQL系统之间的类比:
- MySQL中的表在Mongo中变为集合。
- 行变为文档。
- 列变为字段。
- 连接被定义为链接和嵌入的文档。
这当然是理解MongoDB核心概念的一种简化方式,但仍然很有用。
现在,让我们深入了解实施,以理解这个强大的数据库。
4. Maven依赖
首先,我们需要定义Java驱动程序的MongoDB依赖:
<dependency>
<groupId>org.mongodb</groupId>
<artifactId>mongodb-driver-sync</artifactId>
<version>4.8.2</version>
</dependency>
要检查是否有新版本的库发布,请在这里追踪发布。
5. 使用MongoDB**
现在,让我们开始使用Java实现Mongo查询。我们将从基本的CRUD操作开始,因为它们是最好的入门起点。
5.1. 使用MongoClient建立连接
首先,让我们连接到MongoDB服务器。对于版本>= 2.10.0,我们将使用MongoClient:
MongoClient mongoClient = MongoClients.create("mongodb://localhost:27017");
对于旧版本,使用Mongo类:
Mongo mongo = MongoClients.create("mongodb://localhost:27017");
5.2. 连接到数据库
现在,让我们连接到我们的数据库。值得注意的是,我们不需要创建一个。当Mongo看到数据库不存在时,它会为我们创建。
有时,MongoDB默认以认证模式运行。在这种情况下,我们需要在连接数据库时进行身份验证。
我们可以按照下面的方式进行:
MongoClient mongoClient = MongoClients.create();
MongoDatabase database = mongoClient.getDatabase("myMongoDb");
5.3. 显示现有数据库
让我们显示所有现有的数据库。当我们想要使用命令行时,显示数据库的语法类似于MySQL:
show databases;
在Java中,我们使用以下代码片段显示数据库:
mongoClient.listDatabasesNames().forEach(System.out::println);
输出将是:
local 0.000GB
myMongoDb 0.000GB
这里,local
是Mongo的默认数据库。
5.4. 创建一个集合
让我们首先为我们的数据库创建一个集合(MongoDB中的表等效)。一旦连接到数据库,我们就可以创建一个集合:
database.createCollection("customers");
现在,让我们显示当前数据库的所有现有集合:
database.listCollectionNames().forEach(System.out::println);
输出将是:
customers
**5.5. 保存 - 插入
save
操作具有保存或更新的语义:如果存在_id
,它将执行更新,如果没有,则执行插入。
当我们保存新客户时:
MongoCollection<Document> collection = database.getCollection("customers");
Document document = new Document();
document.put("name", "Shubham");
document.put("company", "Baeldung");
collection.insertOne(document);
该实体将被插入数据库:
{
"_id" : ObjectId("33a52bb7830b8c9b233b4fe6"),
"name" : "Shubham",
"company" : "Baeldung"
}
接下来,我们将查看具有更新语义的相同操作——save
。
**5.6. 保存 - 更新
现在,让我们看看具有更新语义的save
,针对已存在的客户:
{
"_id" : ObjectId("33a52bb7830b8c9b233b4fe6"),
"name" : "Shubham",
"company" : "Baeldung"
}
当我们保存现有客户时——我们将更新它:
Document query = new Document();
query.put("name", "Shubham");
Document newDocument = new Document();
newDocument.put("name", "John");
Document updateObject = new Document();
updateObject.put("$set", newDocument);
collection.updateOne(query, updateObject);
数据库将看起来像这样:
{
"_id" : ObjectId("33a52bb7830b8c9b233b4fe6"),
"name" : "John",
"company" : "Baeldung"
}
如您所见,在这个特定的例子中,save
使用了更新的语义,因为我们使用了带有给定_id
的对象。
5.7. 从集合中读取一个文档
让我们通过查询在集合中搜索一个文档:
Document searchQuery = new Document();
searchQuery.put("name", "John");
FindIterable<Document> cursor = collection.find(searchQuery);
try (final MongoCursor<Document> cursorIterator = cursor.cursor()) {
while (cursorIterator.hasNext()) {
System.out.println(cursorIterator.next());
}
}
它将显示我们当前集合中唯一的文档:
[
{
"_id" : ObjectId("33a52bb7830b8c9b233b4fe6"),
"name" : "John",
"company" : "Baeldung"
}
]
5.8. 删除一个文档
接下来,我们进行最后一个CRUD操作——删除:
Document searchQuery = new Document();
searchQuery.put("name", "John");
collection.deleteOne(searchQuery);
执行此命令后,我们唯一的文档将从集合中删除。
6. 总结
这篇文章快速介绍了从Java使用MongoDB的方法。
这些示例和代码片段的实现可以在GitHub上找到——这是一个基于Maven的项目,因此导入并运行起来应该非常容易。