1. 概述

MongoDB 是一个 NoSQL 数据库,它将数据记录存储为BSON文档,并存放在集合中。我们可以拥有多个数据库,每个数据库可以包含一个或多个文档集合。

与关系型数据库不同,MongoDB 在插入文档时无需定义任何结构即可创建集合。在这个教程中,我们将学习检查集合存在的各种方法,我们将使用collectionExistscreateCollectionlistCollectionNamescount 方法来验证集合是否存在。

2. 数据库连接

为了访问集合中的任何数据,我们首先需要与数据库建立连接。让我们连接到本地机器上运行的 MongoDB 数据库。

2.1. 使用 MongoClient 创建连接

MongoClient 是一个 Java 类,用于与 MongoDB 实例建立连接:

MongoClient mongoClient = MongoClients.create("mongodb://localhost:27017");

这里,我们连接到在本地主机默认端口 27017 运行的 MongoDB。

2.2. 连接到数据库

现在,我们将使用 MongoClient 对象访问数据库。通过 MongoClient 访问数据库有两种方法。

首先,我们将使用getDatabase方法访问 baeldung 数据库:

MongoDatabase database = mongoClient.getDatabase("baeldung");

我们也可以使用Mongo Java驱动的getDB方法连接到数据库:

MongoDatabase db = mongoClient.getDatabase("baeldung");

getDB 方法已弃用,因此不建议使用。

至此,我们已经使用 MongoClient 与 MongoDB 建立了连接,并进一步连接到了 baeldung 数据库。

接下来,我们将深入探讨在 MongoDB 中检查集合存在性的不同方法。

3. 使用 DB

MongoDB Java 驱动提供了同步和异步方法调用。为了连接到数据库,只需指定数据库名称。如果数据库不存在,MongoDB 将自动创建一个。

collectionExists 方法在新版本中不存在,因此我们可以通过调用listCollectionNames()来检查集合是否存在:

MongoClient mongoClient = MongoClients.create("mongodb://localhost:27017");
MongoDatabase db = mongoClient.getDatabase("baeldung");
String testCollectionName = "student";
System.out.println("Collection Name " + testCollectionName + " " + db.listCollectionNames().into(new ArrayList<>()).contains(testCollectionName));

这里,listCollectioNames 方法将返回所有集合,然后与所需的集合进行匹配。

MongoDB Java 驱动的 com.mongodb.DB API 在 3.x 版本之后被弃用,但仍可访问。 因此,不建议在新项目中使用 DB 类。

4. 使用 MongoDatabase

com.mongodb.client.MongoDatabase 是针对 3.x 及以上版本的更新 API。与 DB 类不同,MongoDatabase 类没有提供特定的方法来检查集合是否存在。但是,我们可以使用多种方法来获取所需的结果。

4.1. 使用 createCollection 方法

createCollection 方法在 MongoDB 中创建新的集合。但我们也可利用它来检查集合是否存在:

String databaseName="baeldung";
MongoDatabase database = mongoClient.getDatabase(databaseName);
String testCollectionName = "student";
try {
    database.createCollection(testCollectionName);
} catch (Exception exception) {
    System.err.println("Collection:- "+testCollectionName +" already Exists");
}

上述代码将在数据库中创建名为“student”的新集合,如果它尚未存在。 如果集合已经存在,createCollection 方法将抛出异常。

这种方法不推荐,因为它会在数据库中创建一个新的集合。

4.2. 使用 listCollectionNames 方法

listCollectionNames 方法列出数据库中的所有集合名称。因此,我们可以使用这个方法解决集合存在性问题。

现在让我们看一个使用 Java 驱动代码的 listCollectionNames 方法示例:

String databaseName="baeldung";
MongoDatabase database = mongoClient.getDatabase(databaseName);
String testCollectionName = "student";
boolean collectionExists = database.listCollectionNames()
  .into(new ArrayList()).contains(testCollectionName);
System.out.println("collectionExists:- " + collectionExists);

在这里,我们遍历数据库 baeldung 中的所有集合名称。对于每次出现,我们将集合的字符串名称与 testCollectionName 进行匹配。如果匹配成功,它将返回 true,否则返回 false

4.3. 使用 count 方法

MongoCollectioncount 方法计算集合中文档的数量。

作为一种替代方法,我们可以使用此方法检查集合的存在。以下是相应的 Java 代码片段:

String databaseName="baeldung";
MongoDatabase database = mongoClient.getDatabase(databaseName);
String testCollectionName = "student";
MongoCollection<Document> collection = database.getCollection(testCollectionName);
Boolean collectionExists = collection.countDocuments() > 0 ? true : false;
System.out.println("collectionExists:- " + collectionExists);
Boolean expectedStatus = false;
assertEquals(expectedStatus, collectionExists);

如果集合中没有任何数据,此方法将无法工作,因为它会返回 0,但即使集合为空,也会存在。

5. 总结

在这篇文章中,我们探讨了使用 MongoDatabaseDB 类方法检查集合存在性的各种方法。

简而言之,推荐使用 com.mongodb.DB 类的 collectionExists 方法以及 com.mongodb.client.MongoDatabase 类的 listCollectionNames 方法来检查集合的存在性。

如往常一样,所有示例的源代码和代码片段可在GitHub上找到。