当前位置: 首页 > 知识库问答 >
问题:

Spring Boot数据mongoDB查询嵌套列表

姬衡
2023-03-14

我正在研究spring boot数据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

  • 从数据库中获取mockName的mock对象
  • 在返回的模拟的请求列表中匹配endpoint、主体、参数和方法
  • 返回符合上述所有条件的请求的响应字段

从上面的例子json:

  • 传入值:mockName:tester,方法:GET,endPoint:api,body:{body:'body'},params:{params:'params'}
  • 这应该返回:响应:{data:'GET'}
  • 当且仅当所有这些条件匹配时,它应该返回。

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

共有2个答案

宋凌龙
2023-03-14

编辑:你想用什么来匹配?通常,当通过REST协议调用API/endpoint时,其工作方式如下:请求=

所以我做了一个请求,然后我得到了一个回复——不管它是好是坏,我喜欢还是不喜欢,我都得到了回复。不管我的爱人是否匹配。

我不明白的是整个设计和你试图通过哪些参数来匹配?如果请求列表中不存在值,我们如何匹配?

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

  1. 自由式或使用Swagger首先设计Req和Resp对象(模式)-以上不是您的请求。这些是基本的应用编程接口设计
  2. 二-定义发出请求时需要发生什么,使用什么参数,并期望使用什么值进行条件检查
  3. 定义你期望返回什么-什么字段,等等
  4. 分别并首尾相连地定义以上所有前3点的测试

然后,您可以使用请求中的每一项来测试您的API。从云mongo服务(如mongodb)中引入/引出项目也很简单。com和express轻松完成剩下的工作。

唐晗昱
2023-03-14

要执行这个搜索,最好是使用mongoDB聚合,在这个聚合中,我们将能够一步一步地执行操作。

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

  {
    "$unwind": "$requests"
  }

现在我们将在$匹配中引入搜索参数。我们将能够使用尽可能多的参数。

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

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

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

游戏场

 类似资料:
  • 我问了这个问题作为对另一个问题的评论,也在mongodb-user上发布了一个问题。到目前为止没有回复,所以我求助于问一个单独的问题。 文件说明: 如果字段包含一个数组,则$in操作符选择其字段包含数组的文档,该数组至少包含一个与指定数组中的值匹配的元素(例如,等等) 我正在使用: 在MongoDB外壳中: 下面是应根据文档及其生成的结果工作的查询列表: 为什么这个不行? 为什么我需要所有的钱?

  • 我需要有关嵌套对象数组的查询优化的帮助。 我们有大量文档的集合,每个文档都包含嵌套的对象数组,最高可达3rd级,如下所示: 集合名称:产品 收集文件总数:2000万 每个文档的大小: 我为我的产品集合添加了以下索引,如下所示:, > products.id索引 { “id”:1 } 嵌套数组文档的索引 { " products . sellers . seller _ id ":1 } 我的疑问:

  • 我试图用C#在MongoDB中用嵌套数组文档实现文本搜索功能。我有一个以下格式的MongoDB集合。

  • 问题内容: 我对mongodb还是很陌生,有一件事我现在无法解决: 假设您有以下文档(简体): 哪个查询将返回json-object,其值等于“ value2”? 这意味着,我需要这个json-object: 当然,我已经尝试了很多可能的查询,但是没有一个返回正确的查询,例如 有人可以帮我看看我在做什么错吗? 谢谢! 问题答案: 使用位置运算符 输出量 使用聚合 输出 使用Java驱动程序 输出

  • 这是我在mongo的文档: 我需要更新内部房间阵列中的对象。我尝试了一个选择匹配元素的查询没有语法错误,但出现了一个错误: “errmsg”:“字段“calendar.0.rooms.0.price”必须是数组,但在文档{u id:ObjectId('5cd26a886458720f7a66a3b8')中为字符串类型”, 这是我的疑问: 这是我在StackOverflow中找到的一些参考,但没有帮

  • 和相应的查询解析器 这里的主要想法只是有一个过滤器,可以看到什么食谱有一些成分,用户会通过应用程序通知。 我使用数据库中的所有食谱获得了“recipe”查询,但我需要一个获取这些食谱的查询,然后使用field comprient进行筛选,例如: 食谱-糖蛋糕,配料:糖、蜂蜜、四个… 配方-天鹅绒蛋糕,配料:糖、香草、... 并且用户通知Sugar,API应该返回这2个食谱,但是如果用户通知Suga