Монго весенний запрос, где два поля равны

Я хочу выполнить запрос в 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/

Другие вопросы по тегам