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的项目,因此导入并运行起来应该非常容易。


« 上一篇: Thymeleaf 中日期使用