Как правильно запросить несколько вложенных массивов для совпадения строк? - MongoDB - PullRequest
0 голосов
/ 01 октября 2019

Я пытаюсь создать запрос MongoDB, в котором я могу искать список объектов, которые все содержат несколько вложенных массивов объектов, для одного, где свойство на самом низком уровне содержит часть строки.

Это общая структура этих объектов:

{
   "name": "Foo"
   "structure": {
       "configs":[
          {
            "combinations": [
                {
                  "title": "item1"
                },
                {
                  "title": "item2"
                }
            ]
          },
          {
            "combinations": [
                {
                  "title": "item3"
                },
                {
                  "title": "item4"
                }
            ]
          }
       ]
   }
}

Теперь, когда я ищу "item1" или просто "1", я бы хотел, чтобы этот пример объекта был возвращен,потому что первый массив combinations содержит объект с заголовком item1. Поскольку я собираю приложение в Spring boot, обычно запросы могут легко обрабатываться обычным высоким уровнем findAllByPropertyMatching(String searchTerm) в классе репозитория. Из-за своей сложности это не работает в этом случае, и я действительно борюсь с тем, как это сделать.

Я попробовал пользовательский запрос ...

@Query(value = "{'structure.configs.$[].combination.$[].title': {$regex : ?0, $options: 'i'}}")
public List<Item> findAllByStructuregMatchesRegex(String query);

... но, очевидно, он имеет несколько проблем.

Поскольку данные загружаются из внешнего источника,Я не могу изменить основную структуру данных. Я также не могу кэшировать все элементы и фильтровать их с помощью логики Java, потому что набор данных слишком велик.

Кто-нибудь может указать мне правильное направление? Я очень признателен за вашу помощь, большое спасибо!

1 Ответ

0 голосов
/ 01 октября 2019

После дополнительных проб и ошибок решение кажется довольно простым:

 @Query(value = "{'structure.configs': {\n" +
            "            '$elemMatch': {\n" +
            "                'combinations': {\n" +
            "                    '$elemMatch': {\n" +
            "                        'title': {$regex : ?0, $options: 'i'}\n" +
            "                    }\n" +
            "                }\n" +
            "            }\n" +
            "        }}")
    public List<Item> findAllByStructureMatchesRegex(String query);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...