我的数据库中有一些特定格式的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"
}
}
我希望查询从所有文档中提取c1
下e
的所有值,并将它们放入数组中以进行进一步处理。
答案 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
。
答案 2 :(得分:1)
我同意戴夫的看法,如果您仍在寻找值,请使用cts.values
而不是cts.search
。
Kim建议的路径范围查询对于精确搜索很有用,但是范围查询也应该工作,并且具有不需要预定义范围索引的优点。使用方法如下:
cts.jsonPropertyScopeQuery("e",
cts.jsonPropertyScopeQuery("c1",
cts.trueQuery()))
如cts.jsonPropertyScopeQuery
文档的Usage Notes
中所述,范围查询确实需要启用位置。建议同时启用word position
和element word position
索引。
上述范围查询与e/c1
上的路径索引之间的一个重要区别是,使用路径索引,c1
必须是e
的子级,而范围查询仅检查对于后代。范围查询本质上等效于路径e//c1
。
HTH!