如何在MarkLogic JSON中搜索文件中特定路径处的键值?

时间:2019-09-18 09:21:28

标签: javascript json rest search marklogic

我的数据库中有一些特定格式的JSON文档。在文档的两个位置都有一个密钥。我想编写一个搜索查询,在其中我只能在第二次出现时搜索值。要获得更清晰的图片,请参考下面创建的示例。

我尝试了cts.jsonPropertyScopeQuery("c1",cts.trueQuery()),但未指定路径。我也尝试过cts.jsonPropertyScopeQuery("c1", "e/c1")

 {
    "a": "aa",
    "b": "bb",
    "c": {
        "c1": "cc",
        "c2": "ccc"
    },
    "d": "dd",
    "e": {
        "c1": "xx"
    }
}

我希望查询从所有文档中提取c1e的所有值,并将它们放入数组中以进行进一步处理。

3 个答案:

答案 0 :(得分:2)

如果路径已知,请考虑根据您的目标在特定路径上定义路径范围索引,并使用cts.pathRangeQuery或cts.values。

例如,在/ e / c1(或e / c1,如果需要相对)上定义路径范围索引,然后在该索引上使用cts.values获取所有值:

cts.values(cts.pathReference("e/c1"))

类似地,如果要搜索包含特定值而不是所有值列表的文档,则可以使用cts.pathRangeQuery:

cts.search(cts.pathRangeQuery("e/c1","=","xx"))

更多详细信息:Understanding Path Range Indexes

答案 1 :(得分:1)

由于要检索值列表,因此要设置索引。如果要使用所有c1值,则可以使用范围索引,但是由于只需要其中的一部分,因此需要一个路径范围索引。设置完成后,您可以使用cts.values

更多详细信息:Using Range Indexes for Value Lexicons

答案 2 :(得分:1)

我同意戴夫的看法,如果您仍在寻找值,请使用cts.values而不是cts.search

Kim建议的路径范围查询对于精确搜索很有用,但是范围查询也应该工作,并且具有不需要预定义范围索引的优点。使用方法如下:

cts.jsonPropertyScopeQuery("e",
  cts.jsonPropertyScopeQuery("c1",
    cts.trueQuery()))

cts.jsonPropertyScopeQuery文档的Usage Notes中所述,范围查询确实需要启用位置。建议同时启用word positionelement word position索引。

上述范围查询与e/c1上的路径索引之间的一个重要区别是,使用路径索引,c1必须是e的子级,而范围查询仅检查对于后代。范围查询本质上等效于路径e//c1

HTH!