带有数学表达式的 DocumentDb "where" 子句
DocumentDb "where" clause with mathematical expression
我想了解如何使用 数学比较器 在 DocumentDB 上创建查询 where 子句。
例如,我使用 this demonstrator 了解如何进行 "greater than" 比较:表达式 AND food.version > 0
似乎工作得很好。
这是我在 portal.azure.com documentdb query explorer 上尝试的内容和结果。我不明白为什么我在某些情况下 (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
)需要范围索引才能有效运行。如果没有范围索引,范围查询将需要扫描所有文档(如果 header、x-ms-documentdb-query-enable-scan
由请求传入,我们允许这样做)。
您发出的同时具有相等性和范围过滤器(例如 WHERE d.name='george' AND d.lastUpdateTime > 14
)的查询成功了,因为相等性过滤器极大地缩小了要扫描的文档集。
TL;DR: 你可以在这里做两件事来消除错误:
创建自定义索引策略以添加数字类型的范围索引。可以找到索引策略的文档 here.
以编程方式(而不是通过 Azure 门户)发出查询以设置 x-ms-documentdb-query-enable-scan
header 以允许扫描范围查询。
P.S。我会努力为您改进 Azure 门户。
现在...Azure 门户中似乎存在一些问题 - 我将推动为您修复。
错误:异常消息被截断
看起来在使用 Azure 门户时异常消息的有意义的部分被截断了——这不是什么好事。应该显示的是:
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
header 的能力当前未在 Azure 门户的查询资源管理器中公开。我们将为此添加一个复选框或其他内容。
为了补充 aliuy 的答案,我们正在进行一项更改,以改善此处的开发人员体验 - 数字的默认索引策略将从哈希更改为范围索引,因此您不需要 header 或覆盖索引策略以执行范围查询。
我想了解如何使用 数学比较器 在 DocumentDB 上创建查询 where 子句。
例如,我使用 this demonstrator 了解如何进行 "greater than" 比较:表达式 AND food.version > 0
似乎工作得很好。
这是我在 portal.azure.com documentdb query explorer 上尝试的内容和结果。我不明白为什么我在某些情况下 (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
)需要范围索引才能有效运行。如果没有范围索引,范围查询将需要扫描所有文档(如果 header、x-ms-documentdb-query-enable-scan
由请求传入,我们允许这样做)。
您发出的同时具有相等性和范围过滤器(例如 WHERE d.name='george' AND d.lastUpdateTime > 14
)的查询成功了,因为相等性过滤器极大地缩小了要扫描的文档集。
TL;DR: 你可以在这里做两件事来消除错误:
创建自定义索引策略以添加数字类型的范围索引。可以找到索引策略的文档 here.
以编程方式(而不是通过 Azure 门户)发出查询以设置
x-ms-documentdb-query-enable-scan
header 以允许扫描范围查询。
P.S。我会努力为您改进 Azure 门户。
现在...Azure 门户中似乎存在一些问题 - 我将推动为您修复。
错误:异常消息被截断
看起来在使用 Azure 门户时异常消息的有意义的部分被截断了——这不是什么好事。应该显示的是:
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
header 的能力当前未在 Azure 门户的查询资源管理器中公开。我们将为此添加一个复选框或其他内容。
为了补充 aliuy 的答案,我们正在进行一项更改,以改善此处的开发人员体验 - 数字的默认索引策略将从哈希更改为范围索引,因此您不需要 header 或覆盖索引策略以执行范围查询。