MongoDB - Spring Data выбирает документы, содержащие только запрошенные поля (не больше, не меньше) - PullRequest
0 голосов
/ 30 мая 2018

Я использую MongoDB с Spring Boot 2.0 и Spring Data.У меня есть следующий запрос к MongoDB

{
    "cra": "test-cra",
    "service": "test-service",
    "timestamp": "2012-04-23T18:25:43.511Z",
    "parameters": [
         {
            "name": "test-param-name1",
            "value": "test-param-value1"
         }
    ]
}

Например, в MongoDB у меня есть следующие документы:

{
    "cra": "test-cra",
    "service": "test-service",
    "timestamp": "2012-04-23T18:25:43.511Z",
    "body" : "<response><rating>0.5</rating></response>",
    "parameters": [
      {
         "name": "test-param-name1",
         "value": "test-param-value1"
      },
      {
         "name": "test-param-name2",
         "value": "test-param-value2"
      }
     ]
}

{
    "cra": "test-cra",
    "service": "test-service",
    "timestamp": "2012-04-23T18:25:43.511Z",
    "body" : "<response><rating>0.5</rating></response>",
    "parameters": [
         {
            "name": "test-param-name1",
            "value": "test-param-value1"
         }
    ]
}

В своем ответе я хочу видеть только один документ, который строго отвечает назапросить параметры поиска, и он должен быть:

{
    "cra": "test-cra",
    "service": "test-service",
    "timestamp": "2012-04-23T18:25:43.511Z",
    "body" : "<response><rating>0.5</rating></response>",
    "parameters": [
             {
                 "name": "test-param-name1",
                 "value": "test-param-value1"
             }
    ]
}

Могу ли я с помощью Spring Data построить запрос для получения только документов, которые строго отвечают моим полям запроса (не с более или менее полями)

1 Ответ

0 голосов
/ 30 мая 2018

Вы можете использовать MongoOperations, AggregationOperation и Aggregation для поиска в массиве следующим образом:

    ApplicationContext ctx = new AnnotationConfigApplicationContext(MongoConfig.class);
    MongoOperations mongoOperation = (MongoOperations) ctx.getBean("mongoTemplate"); 

    AggregationOperation match = Aggregation.match(Criteria.where("cra").is("test-cra"));
    AggregationOperation unwind = Aggregation.unwind("parameters");
    AggregationOperation match2 = Aggregation.match(Criteria.where("parameters.value1").is("test-param-value1"));


    Aggregation aggregation = Aggregation.newAggregation(match, unwind, match2);

    AggregationResults<AggregateFactoryResult> output = mongoOperation.aggregate(aggregation, "tablename", AggregateFactoryResult.class);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...