如何添加到 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.AndFilter
。 AndFilter
上没有 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));
}
我正在使用 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.AndFilter
。 AndFilter
上没有 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));
}