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)
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)
| 归档时间: |
|
| 查看次数: |
5848 次 |
| 最近记录: |