首页 > 解决方案 > 如何正确查询多个嵌套数组以进行字符串匹配?- MongoDB

问题描述

我正在尝试构建一个 MongoDB 查询,我可以在其中搜索对象列表,这些对象都包含多个嵌套的对象数组,其中最低级别的属性包含字符串的一部分。

这是这些对象的一般结构:

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

现在,当我搜索“item1”或仅搜索“1”时,我希望返回该示例对象,因为第一个combinations数组包含一个带有 title 的对象item1。由于我在 Spring Boot 中构建应用程序,通常查询可以很容易地由findAllByPropertyMatching(String searchTerm)存储库类中通常的高级处理。由于它的复杂性,这在这种情况下不起作用,我真的在努力解决这个问题。

我尝试了自定义查询...

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

...但显然它有多个问题。

因为数据是从外部源加载的,所以我无法更改底层数据结构。我也无法缓存所有项目并使用 Java 逻辑对其进行过滤,因为数据集太大了。

谁能指出我正确的方向?非常感谢您的帮助,非常感谢!

标签: javaspringmongodbspring-bootmongodb-query

解决方案


经过更多的试验和错误,解决方案似乎非常简单:

 @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);

推荐阅读