mongodb - 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
- 从 db 中获取 mockName 的 mock 对象。
- 匹配返回的 mock 的 Requests List 中的 endPoint、body、params、method。
- 从符合上述所有条件的请求中返回响应字段。
从上面的示例 json :
- 传入值:mockName:tester,方法:GET,endPoint:api,body:{body:'body'},params:{params:'params'}
- 这应该返回:响应:{数据:'GET'}
- 当且仅当所有这些条件都匹配时,它才应该返回。
有任何疑问请告诉我。
解决方案
要执行此搜索,最好使用 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"
}
}
推荐阅读
- c# - 这个轮胎压力代码一直跑出屏幕
- java - '==' 符号未检测到变量上的字符
- android - Gif Xamarin 形成 Android
- java - Java扫描器前进行并返回输入理解查询
- c++ - 进程引用初始化时是否是clang中的错误
- postgresql - 如何进行列级锁定?那可能吗?
- android - Flutter 应用程序包 - 与模拟器不兼容
- typescript - ESLint + TypeScript + 更严格的 if 语句
- php - 获取枢轴id(Laravel)的所有数据
- c# - 如果 Changed 是 EventCallback 类型,为什么我们不能使用 ?。在 Changed?.InvokeAsync()?