Монго весенний запрос, где два поля равны
Я хочу выполнить запрос в Java, где путь и _id два поля документа монго.
Я хочу получить список результатов, где эти два поля равны в документе.
Я попытался использовать следующий запрос. Но не удалось получить результаты должным образом. Получил пустой список, который не имеет место.
List<Metadata> MetadataList= ops.find(new Query(Criteria.where("path").is("_id")), Metadata.class);
Как получить результаты, когда два значения поля равны в монго.
2 ответа
То, что вы ищете, это $where
оператор в MongoDB. Стандартные операции запроса не сравнивают значения одного поля с другим. Для этого вам нужно использовать серверную часть JavaScript для оценки, которая может фактически сравнивать два значения поля:
BasicQuery query = new BasicQuery(
new BasicDBObject("$where", "return this._id == this.path")
);
<Metadata> MetadataList = ops.find(query, Metadata.class);
Или вы можете сделать то же самое с нативными операторами через $redact
стадия конвейера доступна для структуры агрегации.
Уверен, что нет $redact
поддержки в Spring Mongo пока нет, но вы можете обернуть операцию агрегации с помощью класса:
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 не сравнивают значения полей друг с другом. Для этого вам нужно следовать одному из методов здесь.
Вы можете использовать BasicDBObject, чтобы добавить условие.
Попробуйте что-нибудь BasicDBObject query = new BasicDBObject("путь", новый BasicDBObject("$eq", "_id"); collection.find(query);
Пожалуйста, обратитесь по ссылке ниже для получения дополнительной информации http://mongodb.github.io/mongo-java-driver/2.13/getting-started/quick-tour/