我试图查询一个文档很少的集合。有些藏品有“异常”属性,有些则没有 我的最终查询看起来像:
Records that do not contain Exception:
**select COUNT(1) from doc c WHERE NOT IS_DEFINED(c.Exception)**
Records that contain Exception:
**select COUNT(1) from doc c WHERE IS_DEFINED(c.Exception)**
但这似乎不起作用。当NOT IS_DEFINED返回一些计数时,IS_DEFINED返回0条记录,实际上它有数据。
我的数据看起来像(某些文档可以包含Exception属性而其他文档不包含):
[{
'Name': 'Sagar',
'Age': 26,
'Exception: 'Object reference not set to an instance of the object', ...
},
{
'Name': 'Sagar',
'Age': 26, ...
}]
答案 0 :(得分:2)
正如达克斯·福尔(Dax Fohl)在answer中所说,NOT IS_DEFINED
已被实施。有关更多详细信息,请参见cosmos dev blob April updates。
要正确使用它,应将查询的属性添加到集合的索引中。
博客文章摘录:
带有不等式过滤器或未定义值的过滤器的查询现在可以 更有效地运行。以前,这些过滤器没有利用 指数。执行查询时,Azure Cosmos DB将首先评估 查询中其他较便宜的过滤器(例如=,>或<)。如果 有不平等过滤器或未定义值的过滤器 剩下的,查询引擎将需要加载每个 文件。由于不平等过滤器和未定义值的过滤器 现在利用索引,我们可以避免加载这些文档并看到 RU费用显着提高。
以下是具有改进功能的查询过滤器的完整列表:
- 不等式比较表达式(例如c.age!= 4)
- NOT IN表达式(例如c.name NOT IN(“ Luis”,“ Andrew”,“ Deborah”))
- 未定义
- 是表达式(例如,不是IsDefined(c.age),不是IsString(c.name))
- Coalesce运算符表达式(例如(c.name ??'N / A')='Thomas')
- 三元运算符表达式(例如c.name = null?'N / A':c.name)
如果您对这些过滤器有疑问,则应为 相关属性。
答案 1 :(得分:-1)
IS_DEFINED和NOT IS_DEFINED之间的主要区别是前者利用索引而后者不利用(相同w / = vs.!=)。这种情况最有可能是IS_DEFINED查询在单个延续中完成,因此您获得完整的COUNT结果。另一方面,似乎NOT IS_DEFINED查询没有在单个延续中完成,因此您获得了部分COUNT结果。您应该通过查询继续来获得完整的结果。