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

时间:2017-04-30 17:38:19

标签: json cloudant couchdb-2.0 couchdb-mango

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

"i_look_for"

是否有可以在"this_tag"上成功选择值为"tag_properties"的Mango JSON选择器?它在一个数组内(我知道它在数组中的位置)。我也有兴趣过滤结果,所以我只得到结果中的df1['col1'].mul(df2)

我尝试过很多东西,包括$ elemMatch,但一切都回归“无效的json”。

这甚至是芒果的用例还是应该坚持观点?

2 个答案:

答案 0 :(得分:6)

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

json-type CQ index

{
  "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索引类型来回答这个问题。 This article explains the differences,并提供了显示查询数组的有用示例。既然您对不同的索引类型有了更多了解,那么您可以使用Lucene搜索/“text”类型的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类型索引更小且灵活性更低(只能索引特定元素); text-type更大但更灵活(可以索引所有数组元素)。从这个例子中,您还可以看到投影值也有一些权衡(投射特定值与整个数组)。

这些主题中的更多示例:

答案 1 :(得分:2)

如果我正确理解您的问题,根据docs有两种支持的方法:

{
    "what_i_want": {
        "i_look_for": "this_tag"
    }
}

应该等同于缩写形式:

{
    "what_i_want.i_look_for": "this_tag"
}