MarkLogic中的“范围”范围查询?

时间:2020-06-28 01:10:19

标签: marklogic

鉴于以下文档结构,我需要编写一个查询来查找例如500美元以上的所有帐户。

{
  "account": 1, 
  "assets": [
    {
      "currency": "USD", 
      "amount": 600
    }, 
    {
      "currency": "CAD", 
      "amount": 1000
    }, 
    {
      "currency": "EUR", 
      "amount": 200
    }
  ]
}

使用Xpath谓词,就像:

fn:collection()[//(currency='USD' and amount>500)]

但是,我无法利用范围索引为相同目的创建cts查询。天真的我可以为每种货币类型创建一个单独的路径范围索引,但这似乎太多了。

有什么建议吗?谢谢!

2 个答案:

答案 0 :(得分:3)

cts.search(cts.jsonPropertyScopeQuery('assets', 
           cts.andQuery([cts.jsonPropertyValueQuery('currency', 'USD'),
                         cts.jsonPropertyRangeQuery('amount', '>', 599.99)
                         ])
          ))

答案 1 :(得分:1)

Fiona的解决方案在通过运行过滤搜索或索引位置来消除误报时有效。

另一种选择是以不同的方式对数据建模:

{
  "account": 1, 
  "assetsByCurrency": {
    "USD": {"amount": 600}, 
    "CAD": {"amount": 1000}, 
    "EUR": {"amount": 200}
  }
}

使用该模型,应该可以消除误报而无需过滤或定位:

cts.search(cts.jsonPropertyScopeQuery('assetsByCurrency', 
       cts.jsonPropertyScopeQuery('USD',
                     cts.jsonPropertyRangeQuery('amount', '>', 599.99)
                     ))
      ))

另一种可能性是使用TDE索引资产对象并使用Optic API检索数据,该API允许在任何列上进行比较过滤器并消除误报。

希望有帮助,

相关问题