【问题标题】:How to query a array of json in a mongodb document using spring data mongodb如何使用spring data mongodb查询mongodb文档中的json数组
【发布时间】:2023-03-20 17:48:01
【问题描述】:

我正在使用spring data mongodb sdk查询mongo db。

mongoDb 中的文档如下所示:

{
 "data": {
     "suggestions":[
         {
            "key": "take",
             "value": 1

         },
         {
            "key": "donttake",
             "value": 0

         }
      ]
  }  
}

在我的 api 请求中,我的结构类似于上面的“建议”元素。 我想创建一个查询条件,其中“is”子句应该是 api 请求中“suggestions”元素的值。

我使用 spring data mongo db 尝试了以下代码:

JsonParser jsonParser = new JsonParser();
ObjectMapper objMapper = new ObjectMapper();
String jsonArrayString = objMapper.writeValueAsString(apirequest.getSuggestions());
JsonArray arrayFromString = jsonParser.parse(jsonArrayString).getAsJsonArray();

criteria = Criteria.where("data.suggestions").is(arrayFromString);

这段代码的问题在于,当我调试并看到使用上述条件创建的查询时,我输入为 $java: [{"key": "take", "value": 1}]

因此,它无法将其与 mongo 文档匹配,并且不会为我获取任何结果。

还有其他方法可以从 spring data mongo 中查询 mongodb 中的文档数组吗?

【问题讨论】:

    标签: mongodb-query spring-data-mongodb


    【解决方案1】:

    我通过阅读一些关于在 mongodb 中查询数组的信息,采用了完全不同的方法

    https://docs.mongodb.com/manual/tutorial/query-array-of-documents/

    我使用elemMatch解决这个问题如下:

    假设我的 API 请求被映射到对象建议,而 keyVal 是一个存储 keyVal 对的对象。

    for (KeyVal keyVal: suggestions()){
    
      Criteria c = 
             Criteria.where("key").is(keyVal.key()).and("value").is(keyVal.value());
      criteria = Criteria.where("data.suggestions").elemMatch(c); 
    }
    

    然后可以在 mongo 查询中使用条件

    另外,请记住,elemMatch 并不关心数组中文档内元素的顺序。这样一来,elemMatch就很好的解决了目的。

    【讨论】:

    • 对于任何寻找一个简单示例的人来说,如何在某个外部封闭键中搜索数组中的 JSON 对象,此问答一针见血 +1。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-09-13
    • 1970-01-01
    • 1970-01-01
    • 2020-06-01
    • 2016-12-18
    • 1970-01-01
    相关资源
    最近更新 更多