当前位置: 首页 > 面试题库 >

用于深度嵌套JSON的Cloudant / Mango选择器

丁立果
2023-03-14
问题内容

假设我的一些文档具有以下结构:

{  
   "something":{  
      "a":"b"
   },
   "some_other_thing":{  
      "c":"d"
   },
   "what_i_want":{  
      "is_down_here":[  
         {  
            "some":{  
               "not_needed":"object"
            },
            "another":{  
               "also_not_needed":"object"
            },
            "i_look_for":"this_tag",
            "tag_properties":{  
               "this":"that"
            }
         },
         {  
            "but_not":{  
               "down":"here"
            }
         }
      ]
   }
}

是否有MangoJSON选择器可以成功选择"i_look_for""this_tag"?它在数组内部(我知道它在数组中的位置)。我也对过滤结果感兴趣,所以我只能得到"tag_properties"结果。

我已经尝试了很多东西,包括$ elemMatch,但是所有东西大多数都返回“无效的json”。

那是芒果的用例还是我应该坚持观点?


问题答案:

使用Cloudant Query(Mango)选择器语句,您仍然需要在查询之前定义适当的索引。考虑到这一点,这是您的答案:

json型CQ索引

{
  "index": {
    "fields": [
      "what_i_want.is_down_here.0"
    ]
  },
  "type": "json"
}

针对JSON类型索引的选择器

{
  "selector": {
    "what_i_want.is_down_here.0": {
      "i_look_for": "this_tag"
    },
    "what_i_want.is_down_here.0.tag_properties": {
      "$exists": true
    }
  },
  "fields": [
    "_id",
    "what_i_want.is_down_here.0.tag_properties"
  ]
}

上面的解决方案假定您始终知道/可以保证所需的字段在is_down_here数组的第0个元素内。

还有另一种方法可以使用不同的CQ索引类型来回答此问题。本文介绍了这些差异,并提供了一些有用的示例来显示查询数组。现在,您对不同的索引类型有了更多的了解,下面是使用Lucene搜索/“文本”类型的CQ索引回答问题的方法:

文字型CQ索引

{
  "index": {
    "fields": [
      {"name": "what_i_want.is_down_here.[]", "type": "string"}
    ]
  },
  "type": "text"
}

针对文本类型索引的选择器

{
  "selector": {
    "what_i_want.is_down_here": {
      "$and": [
        {"$elemMatch": {"i_look_for": "this_tag"}},
        {"$elemMatch": {"tag_properties": {"$exists": true}}}
      ]
    }
  },
  "fields": [
    "_id",
    "what_i_want.is_down_here"
  ]
}

阅读本文,您将了解每种方法都有其权衡因素:json类型的索引更小,更不灵活(只能索引特定元素);文本类型更大但更灵活(可以索引所有数组元素)。从该示例中,您还可以看到,投影值还具有一些折衷(投影特定值与整个数组)。



 类似资料:
  • Mango 是源自 MongoDB 的 Apache CouchDB 查询语言接口,也就是 CouchDB 的 MongoDB API 层。

  • 问题内容: 我试图找到一种从的有效载荷中解析嵌套属性的干净方法。 这是有效负载的粗略概括: 我的目标是拥有具有和字段的对象数组。 有人知道干净地解析此内容的好方法吗? 现在,我正在尝试创建一个类,并在其中创建一个用于数据,值,用户等的静态内部类。 我用来呼叫端点。 问题答案: 您需要使用JsonPath库,该库仅允许您选择必填字段,然后可以将原始数据转换为类。解决方案示例如下所示: 上面的代码打印

  • 问题内容: 我已经从网站下载了json数据,我想从嵌套的json中选择特定的key:values。我将json转换为python字典。然后,我使用字典理解来选择嵌套的key:values,但是嵌套太多了,我相信有比单独扩展每个字典更好的方法。我在我的方法中看到了冗余。您能建议一个更好的方法吗? 我的方法: 从datetime导入datetime,timedelta 问题答案: 我建议您使用,具有完

  • 问题内容: 我正在尝试从深度嵌套的JSON字符串创建单个Pandas DataFrame对象。 JSON模式是: 期望的结果 我需要将其展平以产生一张桌子: 第一列是值,其余列是键的值并存储在列表中。 到目前为止,我已经 是一个列表,其中长度等于个人数量,即。df对象只是返回 如何遍历该列表以获取dict值并创建N个不同的列?我应该尝试为该列表创建一个DataFrame ,重塑它的形状,然后用角色

  • 问题内容: 我已经从网站下载了json数据,我想从嵌套的json中选择特定的key:values。我将json转换为python字典。然后,我使用字典理解来选择嵌套的key:values,但是嵌套太多了,我相信有比单独扩展每个字典更好的方法。我在我的方法中看到了冗余。您能建议一个更好的方法吗? 我的方法: 从datetime导入datetime,timedelta 问题答案: 我建议您使用,具有完

  • 问题内容: 我想使用选择器使用cloudant db进行查询,例如下面所示:用户希望借入的借贷金额超过数字,如何在cloudant选择器中访问数组以查找特定记录 问题答案: 如果您使用默认的Cloudant Query索引(键入文本,对所有内容建立索引): 然后,以下查询选择器应可以查找例如所有借贷金额> 1000的文档: 我不确定您是否可以哄骗Cloudant查询仅索引数组中的嵌套字段,因此,如