2015-08-12 4 views
0

Я хочу выполнить запрос в java, где path и _id - два поля документа mongo.Mongo spring query, где два поля равны

Я хочу получить список результатов, в котором эти два поля равны в документе.

Я попытался использовать следующий запрос. Но не смог правильно получить результаты. Получил пустой список, который не тот.

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

Как получить результаты, в которых два значения поля равны в монго.

+0

Define failed –

+0

Отредактировал вопрос. Спасибо. – starkk92

ответ

1

Что вы ищете, это оператор в 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 не сравнивают значения полей друг с другом. Для этого вам нужно следовать одному из методов здесь.

0

Вы можете использовать BasicDBObject для добавления условия.

попробовать что-то BasicDBObject запрос = новый BasicDBObject ("путь", новый BasicDBObject ("$ э", "_id"); collection.find (запрос);

Пожалуйста, обратитесь на ссылку ниже для получения дополнительной информации http://mongodb.github.io/mongo-java-driver/2.13/getting-started/quick-tour/

Смежные вопросы