How to Check Field Existence in MongoDB? – 如何在MongoDB中检查字段是否存在?

最后修改: 2021年 8月 25日

中文/混合/英文(键盘快捷键:t)

1. Overview

1.概述

In this short tutorial, we’ll see how to check field existence in MongoDB. 

在这个简短的教程中,我们将看到如何在MongoDB中检查字段的存在。

First, we’ll create a simple Mongo database and sample collection. Then, we’ll put dummy data in it to use later in our examples. After that, we’ll show how to check whether the field exists or not in a native Mongo query as well as in Java.

首先,我们将创建一个简单的Mongo数据库和样本集。然后,我们将在其中放入假数据,以便以后在我们的例子中使用。之后,我们将展示如何在本地Mongo查询和Java中检查字段是否存在。

2. Example Configuration

2.配置示例

Before we start checking field existence, we need an existing database, collection, and dummy data for later use. We’ll be using Mongo shell for that.

在我们开始检查字段的存在性之前,我们需要一个现有的数据库、集合,以及供以后使用的假数据。我们将使用Mongo shell来实现这一点。

Firstly, let’s switch Mongo shell context to an existence database:

首先,让我们把Mongo shell上下文切换到existence数据库。

use existence

It’s worth pointing out that MongoDB only creates the database when you first store data in that database. We’ll insert a single user into the users collection:

值得指出的是,MongoDB只在你第一次在该数据库中存储数据时创建数据库。我们将在users集合中插入一个用户。

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

Now we have everything we need to check, whether the field exists or not.

现在我们有了我们需要检查的一切,不管这个字段是否存在。

3. Checking Field Existence in Mongo Shell

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

Sometimes we need to check for specific field existence by using a basic query, e.g., in Mongo Shell or any other database console. Luckily for us, Mongo provides a special query operator, $exists, for that purpose:

有时我们需要通过基本的查询来检查特定字段的存在,例如在Mongo Shell或任何其他数据库控制台。幸运的是,Mongo为我们提供了一个特殊的查询操作符,$exists,用于该目的。

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

We use a standard find Mongo method in which we specify the field we are looking for and use the $exists query operator. If the name field exists in the users collection, all rows containing that field will be returned:

我们使用标准的find Mongo方法,在该方法中,我们指定我们正在寻找的字段并使用$exists查询操作符。如果name字段存在于users集合中,那么将返回包含该字段的所有记录。

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

If the field is missing, we’ll get an empty result.

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

4. Checking Field Existence in Java

4.在Java中检查字段是否存在

Before we go through possible ways to check field existence in Java, let’s add the necessary Mongo dependency to our project. Here’s the Maven dependency:

在我们了解在Java中检查字段是否存在的可能方法之前,让我们将必要的Mongo依赖性添加到我们的项目中。这里是Maven的依赖性。

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

And here’s the Gradle version:

这里是Gradle的版本。

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

Finally, let’s connect to the existence database and the users collection:

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

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

4.1. Using Filters

4.1.使用过滤器

The com.mongodb.client.model.Filters is a util class from the Mongo dependency that contains a lot of useful methods. We’re going to use the exists() method in our example:

com.mongodb.client.model.Filters是一个来自Mongo依赖的util类,它包含了很多有用的方法。我们将在我们的例子中使用exists()方法。

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

First, we try to find elements from the users collection and get the first found element. If the specified field exists, we get a nameDoc Document as a response. It’s not null and not empty.

首先,我们尝试从users集合中寻找元素,并获得第一个找到的元素。如果指定的字段存在,我们得到一个nameDoc文档作为响应。它不是空的,也不是空的。

Now, let’s see what happens when we try to find a non-existing field:

现在,让我们看看当我们试图找到一个不存在的字段时会发生什么。

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

If no element is found, we get a null Document as a response.

如果没有找到任何元素,我们会得到一个空的Document作为响应。

4.2. Using a Document Query

4.2.使用文档查询

The com.mongodb.client.model.Filters class isn’t the only way to check field existence. We can use an instance of com.mongodb.BasicDBObject:

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());

The behavior is the same as in the previous example. If the element is found, we receive a not null Document, which is empty.

其行为与前面的例子相同。如果找到该元素,我们会收到一个not null Document,它是空的。

The code behaves the same also in a situation when we try to find a non-existing field:

当我们试图找到一个不存在的字段时,代码的行为也是一样的。

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

If no element is found, we get a null Document as a response.

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

5. Conclusion

5.总结

In this article, we discussed how to check field existence in MongoDB. Firstly, we showed how to create a Mongo database, collection, and how to insert dummy data. Then, we explained how to check whether a field exists or not in Mongo shell using a basic query. Finally, we explained how to check field existence using the com.mongodb.client.model.Filters and a Document query approach.

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

As always, the full source code of the article is available over on GitHub.

一如既往,该文章的完整源代码可在GitHub上获得