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

Spu*_*awk 4 java mongodb bson mongodb-java

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

给定以下过滤器:

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));
Run Code Online (Sandbox Code Playgroud)

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

   Bson filter = and(eq("field1", value),
                     gt("field2", value2),
                     eq("field3", optionalValue));
Run Code Online (Sandbox Code Playgroud)

有没有一种方法可以通过将该字段附加到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));
   }
Run Code Online (Sandbox Code Playgroud)

gly*_*ing 6

Filters.and()返回私有静态类的实例:Filters.AndFilter。没有AndFilter允许您更改其状态的公共方法。因此,如果要在构造此对象后附加其他过滤器,则必须将其转换为其他可变形式。例如; 一个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, MongoClient.getDefaultCodecRegistry());

assertThat(completeBsonDocument, is(bsonDocument));
Run Code Online (Sandbox Code Playgroud)

因此,此解决方案是有效的,但我认为比将create调用包装在有条件的块中更难理解且不标准,就像您的问题一样...

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));
}
Run Code Online (Sandbox Code Playgroud)

  • `MongoClient.getDefaultCodecRegistry()` 替换为 `MongoClientSettings.getDefaultCodecRegistry()` (2认同)