如何添加到 Java 中现有的 MongoDB Bson 过滤器

How to add to an existing MongoDB Bson Filter in Java

我正在使用 MongoDB 3.6.3 和 3.6.0 Mongo & Bson 驱动程序 Java。

给定以下过滤器:

import static com.mongodb.client.model.Filter.and;
import static com.mongodb.client.model.Filter.eq;
import static com.mongodb.client.model.Filter.gt;
.
.
.
   Bson filter = and(eq("field1", value),
                     gt("field2", value2));

我需要有条件地向 filter 添加另一个字段,有效地使其成为:

   Bson filter = and(eq("field1", value),
                     gt("field2", value2),
                     eq("field3", optionalValue));

是否可以通过将该字段附加到 filter 来实现这一点,或者我是否必须单独创建过滤器?例如

   Bson filter;
   if (optionFieldRequired)
   {
      Bson filter = and(eq("field1", value),
                        gt("field2", value2));
   }
   else
   {
      Bson filter = and(eq("field1", value),
                        gt("field2", value2),
                        eq("field3", optionalValue));
   }

Filters.and() returns 私有静态实例 class: Filters.AndFilterAndFilter 上没有 public 方法允许您更改其状态。 所以,如果你想在构造这个对象后附加一个额外的过滤器,你必须将它转换成其他一些可变的形式。例如; BsonDocument.

以下代码创建两个 BsonDocument 实例,一个通过向现有过滤器集添加一个过滤器,另一个通过同时创建所有三个过滤器。这两个 BsonDocument 实例是相同的,可以在 collection.find():

中使用
Bson filter = and(eq("field1", "value"), gt("field2", "value2"));
BsonDocument bsonDocument = filter.toBsonDocument(BsonDocument.class, MongoClient.getDefaultCodecRegistry());

Bson optionalFilter = eq("field3", "optionalValue");
BsonDocument optionalBsonDocument = optionalFilter.toBsonDocument(BsonDocument.class, MongoClient.getDefaultCodecRegistry());

// now add the optional filter to the BsonDocument representation of the original filter
bsonDocument.append("field3", optionalBsonDocument.get("field3"));

Bson completeFilter = and(eq("field1", "value"), gt("field2", "value2"), eq("field3", "optionalValue"));
BsonDocument completeBsonDocument = completeFilter.toBsonDocument(BsonDocument.class, MongoClientSettings.getDefaultCodecRegistry());

assertThat(completeBsonDocument, is(bsonDocument));

所以,这个解决方案是有效的,但我认为它比将创建调用包装在条件块中更难理解,也不标准,就像你的问题一样...

Bson filter;
if (!optionFieldRequired) {
  filter = and(eq("field1", value),
                    gt("field2", value2));
} else {
  filter = and(eq("field1", value),
                    gt("field2", value2),
                    eq("field3", optionalValue));
}