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 }})
我们在标准的find
Mongo方法中指定要查找的字段,并使用*$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上找到。