我想在java中执行一个查询,其中path和_id是mongo文档的两个字段。
我想获得文档中这两个字段相等的结果列表。
我尝试过使用以下查询。但是无法正确检索结果。接收到的空列表并非如此。
List<Metadata> MetadataList= ops.find(new Query(Criteria.where("path").is("_id")), Metadata.class);
如何获得mongo中两个字段值相等的结果。
答案 0 :(得分:2)
您正在寻找的是MongoDB中的$where
运算符。标准查询操作不会将一个字段的值与另一个字段的值进行比较。为此,您需要使用JavaScript评估服务器端,它实际上可以比较两个字段值:
BasicQuery query = new BasicQuery(
new BasicDBObject("$where", "return this._id == this.path")
);
<Metadata> MetadataList = ops.find(query, Metadata.class);
或者您可以通过$redact
提供的 aggregation framework 管道阶段与本机运营商做同样的事情。
非常确定spring mongo中还没有$redact
支持,但您可以使用类包装聚合操作来执行此操作:
public class CustomAggregationOperation implements AggregationOperation {
private DBObject operation;
public CustomAggregattionOperation (DBObject operation) {
this.operation = operation;
}
@Override
public DBObject toDBObject(AggregationOperationContext context) {
return context.getMappedObject(operation);
}
}
并像这样使用它:
Aggregation aggregation = newAggregation(
new CustomAggregationOperation(
new BasicDBObject(
"$redact",
new BasicDBObject("$cond",
new BasicDBObject()
.append("if", new BasicDBObject(
"$eq", Arrays.asList("$_id", "$path")
))
.append("then", "$$KEEP")
.append("else", "$$PRUNE")
)
)
)
);
AggregationResults<Metadata> results = ops.aggregate(
(TypedAggregation<Metadata>) aggregation, Metadata.class);
因此,基本的MongoDB查询操作不会将字段值相互比较。要做到这一点,你需要遵循这里的一种方法。
答案 1 :(得分:0)
您可以使用BasicDBObject添加条件。
尝试一下 BasicDBObject query = new BasicDBObject(“path”,new BasicDBObject(“$ eq”,“_ id”); collection.find(查询);
请参阅以下链接以获取更多信息 http://mongodb.github.io/mongo-java-driver/2.13/getting-started/quick-tour/