DocumentDb"其中"带数学表达式的子句

时间:2015-07-03 15:16:25

标签: azure azure-cosmosdb

我想了解如何在DocumentDB中使用数学比较器创建查询 where子句

例如,我使用this demonstrator来了解如何使"大于"比较:表达式AND food.version > 0似乎运作良好。

这是我尝试访问portal.azure.com documentdb查询资源管理器和结果。我不明白为什么我在某些情况下会出现错误(QUERY3),以及(在选项中)如何在portal.azure.com上获取错误详情?!

测试:

>>> QUERY1 >>
SELECT d.id,
       d.name, 
       d.lastUpdateTime
FROM d 
>>> RESULT1 >>
[
  {
    "id": "558d6007b909e8dfb2286e7b",
    "name": "cSimpleSIMS_ici",
    "lastUpdateTime": 1435589982672
  },
  {
    "id": "558d6009b909e8df18296e7b",
    "name": "didier",
    "lastUpdateTime": 1435330811285
  },
  {
    "id": "558d600ab909e8df28296e7b",
    "name": "cDoubleSIMD_ici",
    "lastUpdateTime": 1435331176750
  },
  {
    "id": "558d600bb909e8df55296e7b",
    "name": "george",
    "lastUpdateTime": 1435330813519
  }
  (...)
]

>>> QUERY2 >>
SELECT d.id,
       d.name, 
       d.lastUpdateTime
FROM d 
WHERE (d.name='george')

>>> RESULT2 >>
[
  {
    "id": "558d600bb909e8df55296e7b",
    "name": "george",
    "lastUpdateTime": 1435330813519
  }
]

>>> QUERY3 >>
SELECT d.id,
       d.name, 
       d.lastUpdateTime
FROM d 
WHERE (d.lastUpdateTime > 14)
>>> RESULT3 IN ERROR!

>>> QUERY4 >>
SELECT d.id,
       d.name, 
       d.lastUpdateTime
FROM d 
WHERE (d.name='george' AND d.lastUpdateTime > 14)

>>> RESULT4 >>
[
  {
    "id": "558d600bb909e8df55296e7b",
    "name": "george",
    "lastUpdateTime": 1435330813519
  }
]


>>> QUERY5 >>
SELECT d.id,
       d.name, 
       d.lastUpdateTime
FROM d 
WHERE (d.name='george' AND d.lastUpdateTime > 1435330813519)

>>> RESULT5 >>
[]

2 个答案:

答案 0 :(得分:4)

这里是要点......

今天,DocumentDB中的所有JSON属性都被哈希索引自动索引;这意味着具有相等运算符的查询(例如WHERE d.name= "george")非常快。

另一方面,范围查询(例如WHERE d.lastUpdateTime > 14)需要范围索引才能有效运行。如果没有范围索引,范围查询将需要扫描所有文档(如果请求传入标题x-ms-documentdb-query-enable-scan,我们允许)。

您发出的具有相等和范围过滤器(例如WHERE d.name='george' AND d.lastUpdateTime > 14)的查询成功,因为相等过滤器大大缩小了要扫描的文档集。

TL; DR:您可以在这里做两件事来摆脱错误:

  1. 创建自定义索引策略以为数字类型添加范围索引。可以找到索引策略的文档here

  2. 以编程方式(而不是通过Azure门户)发出查询,以设置x-ms-documentdb-query-enable-scan标题以允许扫描范围查询。

  3. <强> P.S。我将推动为您改进Azure门户。

    现在...... Azure门户中似乎存在一些问题 - 我将推动为您解决这个问题。

    错误:异常消息被截断

    在使用Azure门户时,看起来异常消息的有意义部分会被截断 - 这不是bueno。我们应该展示的是:

    Microsoft.Azure.Documents.DocumentClientException: Message: {"Errors":["An invalid query has been specified with filters against path(s) that are not range-indexed. Consider adding allow scan header in the request."]}
    

    缺少功能:在查询资源管理器中启用扫描

    可以设置x-ms-documentdb-query-enable-scan标头当前未在Azure门户的查询资源管理器中公开。我们将为此添加一个复选框或其他内容。

答案 1 :(得分:1)

为了增加aliuy的答案,我们正在进行改进,以改善开发人员的体验 - 数字的默认索引策略将从Hash更改为Range索引,因此您不需要标头或覆盖索引策略以执行范围查询。