1. 概述

在这个简短的教程中,我们将学习如何在MongoDB中检查字段是否存在。

首先,我们将创建一个简单的Mongo数据库和样本集合。然后,我们将添加一些示例数据,以便稍后在我们的例子中使用。之后,我们将展示如何在原生Mongo查询中以及在Java中检查字段是否存在。

2. 示例配置

在开始检查字段存在之前,我们需要一个现有的数据库、集合和用于后续操作的示例数据。我们将使用Mongo shell来完成这些操作。

首先,让我们将Mongo shell上下文切换到一个名为“existence”的数据库:

use existence

值得注意的是,MongoDB只有在第一次在该数据库中存储数据时才会创建该数据库。接下来,我们将向“users”集合插入一个用户:

db.users.insert({name: "Ben", surname: "Big" })

现在我们已经准备好检查了,无论是检查字段是否存在。

3. 在Mongo Shell中检查字段存在

有时,我们可能需要通过基本查询(如在Mongo Shell或其他数据库控制台)来检查特定字段是否存在。幸运的是,Mongo提供了一个特殊的查询运算符*$exists*$,用于此目的:

db.users.find({ 'name' : { '$exists' : true }})

我们在标准的findMongo方法中指定要查找的字段,并使用*$exists*$查询运算符。如果“users”集合中有“name”字段,将返回包含该字段的所有行:

[
  {
    "_id": {"$oid": "6115ad91c4999031f8e6f582"},
    "name": "Ben",
    "surname": "Big"
  }
]

如果字段缺失,我们将得到一个空的结果。

4. 在Java中检查字段存在

在我们详细介绍在Java中检查字段存在的几种可能方法之前,先向项目添加必要的MongoDB依赖。这是Maven依赖项:

<dependency>
    <groupId>org.mongodb</groupId>
    <artifactId>mongo-java-driver</artifactId>
    <version>3.12.10</version>
</dependency>

以下是Gradle版本:

implementation group: 'org.mongodb', name: 'mongo-java-driver', version: '3.12.10'

最后,让我们连接到“existence”数据库和“users”集合:

MongoClient mongoClient = new MongoClient();
MongoDatabase db = mongoClient.getDatabase("existence");
MongoCollection<Document> collection = db.getCollection("users");

4.1. 使用过滤器

来自MongoDB依赖的com.mongodb.client.model.Filters类是一个实用工具类,其中包含许多有用的方法。在示例中,我们将使用exists()方法:

Document nameDoc = collection.find(Filters.exists("name")).first();
assertNotNull(nameDoc);
assertFalse(nameDoc.isEmpty());

首先,我们尝试从“users”集合中查找元素并获取找到的第一个元素。如果指定的字段存在,我们将收到一个名为“nameDoc”的Document作为响应,它既不为null也不为空。

现在,让我们看看当我们尝试查找不存在的字段时会发生什么:

Document nameDoc = collection.find(Filters.exists("non_existing")).first();
assertNull(nameDoc);

如果没有找到元素,我们将收到一个null Document作为响应。

4.2. 使用Document查询

com.mongodb.client.model.Filters类并不是检查字段存在的唯一方式。我们可以使用com.mongodb.BasicDBObject实例:

Document query = new Document("name", new BasicDBObject("$exists", true));
Document doc = collection.find(query).first();
assertNotNull(doc);
assertFalse(doc.isEmpty());

其行为与前一个示例相同。如果找到元素,我们将收到一个非null的Document,但它是空的。

在试图查找不存在的字段的情况下,代码的行为也是一样的:

Document query = new Document("non_existing", new BasicDBObject("$exists", true));
Document doc = collection.find(query).first();
assertNull(doc);

如果没有找到元素,我们将收到一个null Document作为响应。

5. 总结

在这篇文章中,我们讨论了如何在MongoDB中检查字段是否存在。首先,我们展示了如何创建Mongo数据库、集合,以及如何添加示例数据。然后,我们解释了如何在Mongo shell中使用基本查询检查字段是否存在。最后,我们解释了如何使用com.mongodb.client.model.Filters和Document查询方法来检查字段存在。

如往常一样,文章的完整源代码可以在GitHub上找到。