MongoDB中向现有BSON过滤器添加字段

1. 概述

MongoDB 是一个流行的分布式、开源的NoSQL文档存储引擎。它本质上是一个文档数据库,使用称为BSON(二进制JavaScript对象表示法)的JSON格式存储数据。MongoDB中以BSON数据形式存储的文档被组织成集合。

在这个教程中,我们将讨论在MongoDB现有BSON过滤器中添加字段的不同方法,并使用Java驱动程序来实现它们。

2. 数据库初始化

在继续之前,我们首先创建一个新的数据库和样本集合。我们将用这些来演示所有代码示例。

让我们创建一个名为baeldung的数据库:

use baeldung;

如果数据库不存在,此命令将为我们创建一个新的空数据库。

接下来,我们在新创建的数据库中创建一个名为pet的集合:

db.createCollection("pet");

至此,我们的示例baeldung数据库和pet集合已经成功设置。

最后,我们在pet集合中添加一些样例数据:

db.pet.insertMany([
{
    "petId":"P1",
    "name":"Tom", 
    "age":3,
    "type":"Cat",
    "gender": "Female"
},
{ 
    "petId":"P2",
    "name":"Max", 
    "age":4,
    "type":"Dog",
    "gender": "Male"
},
{
    "petId":"P3",
    "name":"Milo", 
    "age":8,
    "type":"Dog",
    "gender": "Male"
}]);

插入成功后,上述脚本将返回一个JSON结果:

{
    "acknowledged" : true,
    "insertedIds" : [
        ObjectId("64007c0a2b07cc62bfe6accc"),
        ObjectId("64007c0a2b07cc62bfe6accd"),
        ObjectId("64007c0a2b07cc62bfe6acce")
    ]
}

现在,我们深入理解如何向现有的BSON过滤器添加字段。

3. 向现有BSON过滤器添加字段

我们将使用Filters构建器向现有过滤器添加字段。构建器是MongoDB Java驱动程序提供的类,帮助我们构造BSON对象。

Java中的Filters类提供了所有MongoDB查询运算符的静态工厂方法。每个方法都会返回一个Bson类型的实例。然后,我们可以将这个Bson对象传递给任何期望查询过滤器的方法。

请注意,由于Filters是不可变的,我们不能直接编辑它们。我们将不得不使用现有的过滤器应用一些过滤运算符来创建一个新的Bson过滤器。

具体来说,我们将使用*Filters.and()方法执行添加操作。Filters.and()*方法基本上创建了一个过滤器,对提供的过滤器列表执行逻辑与操作。

有两种方法可以实现这一点:

  1. 使用BsonDocument
  2. 使用Filters

现在,让我们深入了解上述两种方法。

3.1. 使用BsonDocument

在这个方法中,我们首先将现有的Bson过滤器转换为BsonDocument。然后,我们将所需的字段附加到这个BsonDocument上。

首先,假设我们有一个过滤器,它返回宠物类型为“Dog”的pet集合文档:

Bson existingFilter = eq("type", "Dog");
BsonDocument existingBsonDocument = existingFilter.toBsonDocument(BsonDocument.class, MongoClient.getDefaultCodecRegistry());

我们已将过滤器转换为BsonDocument类型。

其次,如果我们想在此过滤器中添加一个字段,使宠物的年龄超过5岁,我们将为此字段创建一个Bson过滤器,并将其转换为BsonDocument对象:

Bson newFilter = gt("age", 5);
BsonDocument newBsonDocument = newFilter.toBsonDocument(BsonDocument.class, MongoClient.getDefaultCodecRegistry());

最后,我们将新字段附加到现有BsonDocument上:

existingBsonDocument.append("age", newBsonDocument.get("age"));

FindIterable<Document> documents = collection.find(existingBsonDocument);

MongoCursor<Document> cursor = documents.iterator();
while (cursor.hasNext()) {
    System.out.println(cursor.next());
}

BsonDocument.append()方法接受一个键和一个BsonValue,然后将其附加到现有的BsonDocument。然后,我们可以使用结果BsonDocument从MongoDB集合中查询文档。

3.2. 使用Filters

这种方法直接使用Filters,而不先将其转换为BsonDocument

假设我们有一个过滤器,它返回宠物类型为“Dog”且性别为“Male”的pet集合文档:

Bson exisingFilter = and(eq("type", "Dog"), eq("gender", "Male"));
FindIterable<Document> documents = collection.find(exisingFilter);

MongoCursor<Document> cursor = documents.iterator();
while (cursor.hasNext()) {
    System.out.println(cursor.next());
}

上述片段将打印匹配我们条件的所有pet集合文档:

Document{{_id=64007c0a2b07cc62bfe6accd, petId=P2, name=Max, age=4.0, type=Dog, gender=Male}}
Document{{_id=64007c0a2b07cc62bfe6acce, petId=P3, name=Milo, age=8.0, type=Dog, gender=Male}}

假设我们现在想要修改此过滤器,添加一个条件,即宠物的年龄大于5岁。我们将利用*Filters.and()*方法,它接受现有过滤器和要添加的新字段作为参数。

让我们看看Java实现代码:

Bson existingFilter = and(eq("type", "Dog"), eq("gender", "Male"));

Bson newFilter = and(existingFilter, gt("age", 5));
FindIterable<Document> documents = collection.find(newFilter);

MongoCursor<Document> cursor = documents.iterator();
while (cursor.hasNext()) {
    System.out.println(cursor.next());
}

这段代码将通过在现有过滤器中添加所需字段和条件来创建一个新的Bson过滤器。我们可以使用新的字段以及MongoDB中可用的任何过滤运算符。现在,片段将打印出pet集合中类型为“Dog”,性别为“Male”且年龄大于5岁的文档:

Document{{_id=64007c0a2b07cc62bfe6acce, petId=P3, name=Milo, age=8.0, type=Dog, gender=Male}}

这是向现有Bson过滤器添加字段最方便的方法。

4. 结论

在这篇文章中,我们了解了在MongoDB中向现有BSON过滤器添加字段的各种方法,并使用相应的Java驱动程序代码进行了讨论。

使用Java驱动程序代码,我们首先查看了使用BsonDocument类的实现,然后学习了直接使用Filters类实现相同功能的方法。

如往常一样,所有示例的完整代码可以在GitHub上找到。


原始标题:Add Field to an Existing MongoDB Bson Filter in Java | Baeldung