gpt4 book ai didi

java - Mongo spring 查询两个字段相等的情况

转载 作者:行者123 更新时间:2023-11-30 03:18:23 32 4
gpt4 key购买 nike

我想在java中执行一个查询,其中path和_id是mongo文档的两个字段。

我想获取文档中这两个字段相等的结果列表。

我尝试使用以下查询。但无法正确检索结果。收到空列表,但情况并非如此。

List<Metadata> MetadataList= ops.find(new Query(Criteria.where("path").is("_id")), Metadata.class);

如何在 mongo 中获取两个字段值相等的结果。

最佳答案

您正在寻找的是$where MongoDB 中的运算符。标准查询操作不会将一个字段的值与另一字段的值进行比较。为此,您需要使用 JavaScript 评估服务器端,它实际上可以比较两个字段值:

    BasicQuery query = new BasicQuery(
new BasicDBObject("$where", "return this._id == this.path")
);

<Metadata> MetadataList = ops.find(query, Metadata.class);

或者您可以通过 $redact 对 native 运算符执行相同的操作 管道阶段可用于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 查询操作不会相互比较字段值。为此,您需要遵循此处的方法之一。

关于java - Mongo spring 查询两个字段相等的情况,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31960079/

32 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com