Spring Boot mongoDB Aggregation возвращает пустые данные - PullRequest
0 голосов
/ 29 января 2020

У меня проблема с фильтрацией данных mongoDB. Вот данные:

{
   "name":"Macbook Pro",
   "category":"Apple",
   "productId":"X90fD0uD8MsBoc4",
   "details":{
      "rating":"5",
      "stocks":"10",
      "price":"null",
      "tags":[
         {
            "tags1":"apple",
            "tags2":"macbook",
            "tags3":null
         }
      ],
      "brand":"Apple",
      "description":"null",
      "picture":[
         {
            "picture1":"photo1",
            "picture2":"photo2",
            "picture3":"photo 3",
            "picture4":null,
            "picture5":null
         }
      ],
      "thumbnails":[
         {
            "thumbnail1":"thumbails1",
            "thumbnail2":"thumbails2",
            "thumbnail3":null,
            "thumbnail4":null,
            "thumbnail5":null
         }
      ]
   }
}

Теперь, когда я пытаюсь отфильтровать его с помощью этого кода:

final Aggregation aggregation = Aggregation.newAggregation(
    Aggregation.match(
        Criteria.where("name").regex(query, "i").and("details").elemMatch(
            Criteria.where("brand").regex(query, "i"))
        ),
    Aggregation.skip(page * pageable.getPageSize()),
    Aggregation.limit(pageable.getPageSize())
);
List<Products> filter = mongoTemplate.aggregate(aggregation, "Product", Products.class).getMappedResults();
return new PageImpl<Products>(filter, pageable, filter.size())

В результате получается пустой массив.

1 Ответ

0 голосов
/ 30 января 2020

Я считаю, что причиной того, что в результате вы получаете пустой массив, является операция сопоставления. Вы говорите mon go, что вы хотите сопоставить регулярное выражение как в поле имени, так и в поле details.brand, используя ту же строку, запрос. Поэтому, если вы ищете «ma c», поле имени будет найдено, но не поле бренда, и наоборот для поиска по «яблоку». Попробуйте использовать OrOperator.

Примерно так:

Aggregation.match( Criteria.orOperator( Criteria.where( "name" ).regex( query, "i" ), Criteria.where( "details.brand" ).regex( query, "i" ) ) )
...