Что вы ищете, это оператор в MongoDB. Стандартные операции запроса не сравнивают значения одного поля с другим. Для того, чтобы сделать это, вам нужно использовать на стороне сервера оценки JavaScript, который может на самом деле сравнивать значения двух полей:
BasicQuery query = new BasicQuery(
new BasicDBObject("$where", "return this._id == this.path")
);
<Metadata> MetadataList = ops.find(query, Metadata.class);
Или вы можете сделать то же самое с носителями операторов через стадию $redact
трубопровода имеющейся в aggregation framework.
Довольно уверен, что нет поддержки $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 не сравнивают значения полей друг с другом. Для этого вам нужно следовать одному из методов здесь.
Define failed –
Отредактировал вопрос. Спасибо. – starkk92