Azure CosmosDB IS_DEFINED与非IS_DEFINED

时间:2017-12-08 15:49:58

标签: azure-cosmosdb

我试图查询一个文档很少的集合。有些藏品有“异常”属性,有些则没有 我的最终查询看起来像:

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, ...
}]

2 个答案:

答案 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结果。您应该通过查询继续来获得完整的结果。