Spring-boot数据mongoDB查询嵌套列表

Posted

技术标签:

【中文标题】Spring-boot数据mongoDB查询嵌套列表【英文标题】:Spring-boot data mongoDB query nested list 【发布时间】:2021-12-15 23:39:03 【问题描述】:

我正在开发 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' 当且仅当所有这些条件都匹配时,它才应该返回。

如有任何疑问,请告诉我。

【问题讨论】:

这是您需要的吗? mongoplayground.net/p/iHMzsUsQ8zn 如果是这样,我会发布完整的答案。 谢谢@RubénVega,但这会返回一个响应列表。 [ "a": "返回这个响应" , "b": " and this one" , "c": " and this one" ] .我将编辑问题只是为了清除它。 我想我误解了一些事情......这正是您需要的吗? mongoplayground.net/p/IFel2geB3EK @RubénVega 谢谢,这正是我想要的。如何将此 mongoDB 查询与 springboot 应用程序一起使用?我尝试使用“@Query”、mongoTemplate 等。还将其添加为答案,以便将其标记为正确。感谢您的努力。 我没有使用 springboot 的经验,您应该查看其他类似的帖子。 ***.com/questions/59703147/… 【参考方案1】:

编辑: 你想通过什么来匹配? 通常,通过 REST 协议调用的 API/端点的工作方式如下: 请求 =>

所以我提出了一个请求,然后我拿回了一个资源——不管它好不喜欢,我都会拿回来。我的参数是否匹配。

我无法理解的是整个设计以及您要通过哪些参数来匹配?如果请求 LIST 中不存在值,我们如何匹配?

我认为有很多问题需要首先回答。但这里有一些帮助以及我将如何开始设计它:

    Freestyle 或使用 Swagger 首先设计 Req 和 Resp 对象(模式) - 这些不是您上面的请求。这些是基本的 API 设计 二 - 定义发出请求时需要发生的事情、使用哪些参数并期望使用哪些值来进行条件检查 定义您期望返回的内容 - 哪些字段等。 分别定义对上述所有前 3 点进行端到端的测试

然后您可以使用 Request 中的每个项目来测试您的 API。将项目拉入/拉出云 mongo 服务(例如 mongodb.com)也很简单,并且使用 express 易于执行 REST。

【讨论】:

我正在尝试创建模拟服务器。它保存端点、请求数据和响应。当我们使用之前提供的请求数据到达端点时,我们可以得到响应。当项目的后端尚未完成并且前端正在向前推进时,这些东西真的很有帮助。它就像一个虚拟数据供前端使用【参考方案2】:

要执行此搜索,最好使用 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"
    
  

Playground

【讨论】:

以上是关于Spring-boot数据mongoDB查询嵌套列表的主要内容,如果未能解决你的问题,请参考以下文章

mongodb 查询求助,嵌套数组里面查东西

在 mongodb 中项目嵌套列

查询 $match 和 $project 重嵌套数据(MongoDB/聚合)

带有 elemMatch 的 MongoDB 查询,用于从对象内部匹配嵌套数组数据 [重复]

当嵌套字典键发生变化时,如何使用嵌套字典查询 mongodb 文档?

MongoDB 嵌套搜索查询参数