Spring-引导数据mongoDB查询嵌套列表
Spring-boot data mongoDB query nested list
我正在处理 spring-boot-data-mongoDB。我在查询包含特定对象列表的嵌套文档时遇到一些问题。
模拟 class
@Document
public class Mock {
@Id
private String id;
@Indexed(unique = true)
private String name;
private List<Request> requests;
}
请求class
@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'
}
]
所需的查询输出:传入端点、模拟名称、正文、参数和方法
- 从数据库中获取 mockName 的 mock 对象。
- 在 returned 模拟的请求列表中匹配端点、正文、参数、方法。
- Return 符合上述所有条件的请求的响应字段。
来自上面的例子 json :
- 传入的值:mockName:tester,方法:GET,endPoint:api,body:{body:'body'},params:{params:'params'}
- 这应该 return :
响应:{数据:'GET'}
- 当且仅当所有这些条件都匹配时,它应该 return。
如有任何疑问,请告诉我。
编辑:
你想匹配什么?
通常 APIs/endpoints 当通过 REST 协议调用时是这样工作的:
请求 => <= 响应
所以我提出了一个请求,然后我得到了一个资源——不管它好不好,我喜欢还是不喜欢,我都会把它拿回来。我的参数是否匹配。
我无法理解的是整个设计以及您要匹配的内容,即哪些参数?如果请求 LIST 中没有值,我们如何匹配?
我觉得有很多问题需要先回答。但这里有一些帮助以及我将如何开始设计它:
- 自由设计或使用 Swagger 首先设计 Req 和 Resp 对象(模式)- 这些不是您上面的请求。这些是基本的API设计
- 二 - 定义发出请求时需要发生什么,使用什么参数并期望使用什么值进行条件检查
- 定义您期望返回的内容 - 哪些字段等
- 定义单独并端到端地测试上述所有前 3 个点
然后您可以使用 Request 中的每个项目来测试您的 API。拉取云 mongo 服务的项目 in/out 也很公平直接,例如 mongodb.com 并且使用 express 轻松完成 REST。
要执行此搜索,最好的方法是使用 mongoDB aggregation,在此聚合中,我们将能够逐步执行操作。
由于您只想查询一个数组中的一个子文档,因此我们必须执行的第一个操作是该数组的 $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"
}
}
我正在处理 spring-boot-data-mongoDB。我在查询包含特定对象列表的嵌套文档时遇到一些问题。
模拟 class
@Document
public class Mock {
@Id
private String id;
@Indexed(unique = true)
private String name;
private List<Request> requests;
}
请求class
@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'
}
]
所需的查询输出:传入端点、模拟名称、正文、参数和方法
- 从数据库中获取 mockName 的 mock 对象。
- 在 returned 模拟的请求列表中匹配端点、正文、参数、方法。
- Return 符合上述所有条件的请求的响应字段。
来自上面的例子 json :
- 传入的值:mockName:tester,方法:GET,endPoint:api,body:{body:'body'},params:{params:'params'}
- 这应该 return : 响应:{数据:'GET'}
- 当且仅当所有这些条件都匹配时,它应该 return。
如有任何疑问,请告诉我。
编辑: 你想匹配什么? 通常 APIs/endpoints 当通过 REST 协议调用时是这样工作的: 请求 => <= 响应
所以我提出了一个请求,然后我得到了一个资源——不管它好不好,我喜欢还是不喜欢,我都会把它拿回来。我的参数是否匹配。
我无法理解的是整个设计以及您要匹配的内容,即哪些参数?如果请求 LIST 中没有值,我们如何匹配?
我觉得有很多问题需要先回答。但这里有一些帮助以及我将如何开始设计它:
- 自由设计或使用 Swagger 首先设计 Req 和 Resp 对象(模式)- 这些不是您上面的请求。这些是基本的API设计
- 二 - 定义发出请求时需要发生什么,使用什么参数并期望使用什么值进行条件检查
- 定义您期望返回的内容 - 哪些字段等
- 定义单独并端到端地测试上述所有前 3 个点
然后您可以使用 Request 中的每个项目来测试您的 API。拉取云 mongo 服务的项目 in/out 也很公平直接,例如 mongodb.com 并且使用 express 轻松完成 REST。
要执行此搜索,最好的方法是使用 mongoDB aggregation,在此聚合中,我们将能够逐步执行操作。
由于您只想查询一个数组中的一个子文档,因此我们必须执行的第一个操作是该数组的 $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"
}
}