带有数学表达式的文档 Db "where"子句



我想了解如何在DocumentDB上创建查询where子句,其中包含数学比较器

例如,我使用这个演示器来理解如何进行"大于"比较:表达式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 >>
[]

要点如下

如今,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. 创建自定义索引策略以添加数字类型的范围索引。索引策略的文档可以在这里找到。

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

附言:我将为您改进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门户的查询资源管理器中公开。我们将为此添加一个复选框或其他内容。

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

最新更新