首页 > 解决方案 > Spring-boot数据mongoDB查询嵌套列表

问题描述

我正在研究 spring-boot-data-mongoDB。我在查询具有特定对象列表的嵌套文档时遇到了一些问题。

模拟课

@Document
public class Mock {
    @Id
    private String id;

    @Indexed(unique = true) 
    private String name;

    private List<Request> requests;
}

请求类

@Document
public class Request {

    @Id
    private String id;
    private int status;
    private String method;
    private String endPoint;
    private Map<String, Object> response;
    private Map<String, Object> body;
    private Map<String, String> params;
}

示例 JSON

[
{
    _id: '53fc6dde-7a534-4b37-a57e-t0bd62f50046',
    name: 'mock1',
    requests: [
        {
            status: 200,
            method: 'GET',
            endPoint: 'status',
            response: {},
            body: {},
            params: {}
        }
    ],
    _class: 'com.example.mockserverspring.models.Mock'
},
{
    _id: '73fc6dde-7a5b-4b37-a57e-d0bd62f50046',
    name: 'tester',
    requests: [
        {
            _id: '802220ea-a1c7-484d-af1b-86e29b540179',
            status: 200,
            method: 'GET',
            endPoint: 'api',
            response: {
                data: 'GET'
            },
            body: {
                body: 'body'
            },
            params: {
                params: 'params'
            }
        },
        {
            _id: 'ff8673d7-01a9-4d6f-a42e-0214a56b227b',
            status: 200,
            method: 'GET',
            endPoint: 'data',
            response: {},
            body: {
                data: 'data'
            },
            params: {
                value: '10'
            }
        },
        {
            _id: '7fd5a860-b415-43b0-8115-1c8e1b95c3ec',
            status: 200,
            method: 'GET',
            endPoint: 'status',
            response: {},
            body: {},
            params: {}
        }
    ],
    _class: 'com.example.mockserverspring.models.Mock'
}
]

期望的查询输出:传入endPoint、mockName、body、params和method

从上面的示例 json :

有任何疑问请告诉我。

标签: mongodbspring-bootmongodb-queryspring-dataspring-data-mongodb

解决方案


要执行此搜索,最好使用 mongoDB聚合,在此聚合中,我们将能够逐步执行操作。

由于您只想查询一个数组中的一个子文档,我们必须执行的第一个操作是该数组的 $unwind。这将分隔每个子文档,我们可以执行搜索。

  {
    "$unwind": "$requests"
  }

现在我们将介绍 $match 中的搜索参数。我们将能够使用尽可能多的我们想要的。

  {
    "$match": {
      "name": "tester",
      "requests.method": "GET",
      "requests.endPoint": "api",
      "requests.body": {
        body: "body"
      },
      "requests.params": {
        params: "params"
      }
    }
  }

最后,由于我们只想要特定字段的信息,我们将使用 $replaceRoot 来格式化我们的输出。

  {
    "$replaceRoot": {
      "newRoot": "$requests.response"
    }
  }

操场


推荐阅读