Azure CosmosDB IS_DEFINED 与 NOT IS_DEFINED

Vid*_*ddy 5 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)**
Run Code Online (Sandbox Code Playgroud)

但这似乎行不通。当 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, ...
}]
Run Code Online (Sandbox Code Playgroud)

Rei*_*unk 6

更新

\n

正如 Dax Fohl 在回答 NOT IS_DEFINED中所说,现已实施。有关更多详细信息,请参阅 Cosmos 开发 Blob四月更新。

\n

要正确使用它,应将查询的属性添加到集合的索引中。

\n

博客文章摘录:

\n
\n

现在可以更高效地运行带有不等式过滤器或针对未定义值的过滤器的查询。以前,这些过滤器不使用\n索引。执行查询时,Azure Cosmos DB 将首先评估查询中\n较便宜的筛选器(例如 =、> 或 <)。如果\n存在不等式过滤器或针对剩余未定义值的\n过滤器,则查询引擎将需要加载这些\n每个文档。由于不等式过滤器和未定义值的过滤器现在利用了索引,因此我们可以避免加载这些文档并看到 RU 费用的显着改善。

\n

这里\xe2\x80\x99是经过改进的查询过滤器的完整列表:

\n
    \n
  • 不等式比较表达式(egcage != 4)
  • \n
  • NOT IN 表达式 (egcname NOT IN (\xe2\x80\x98Luis\xe2\x80\x99, \xe2\x80\x98Andrew\xe2\x80\x99, \xe2\x80\x98Deborah\xe2\x80\x99))
  • \n
  • 未定义
  • \n
  • Is 表达式(例如 NOT IsDefined(c.age)、NOT IsString(c.name))
  • \n
  • 合并运算符表达式(例如 (c.name ?? \xe2\x80\x98N/A\xe2\x80\x99) = \xe2\x80\x98Thomas\xe2\x80\x99)
  • \n
  • 三元运算符表达式(egcname = null ? \xe2\x80\x98N/A\xe2\x80\x99 : c.name)
  • \n
\n

如果您有使用这些过滤器的查询,则应为相关属性添加索引。\n

\n
\n


Sam*_*hra 4

IS_DEFINED 和 NOT IS_DEFINED 之间的主要区别是前者使用索引,而后者不使用索引(相同 w/ = 与 !=)。这里最有可能的情况是 IS_DEFINED 查询在单个延续中完成,因此您可以获得完整的 COUNT 结果。另一方面,NOT IS_DEFINED 查询似乎没有在单个延续中完成,因此您得到了部分 COUNT 结果。您应该通过继续查询来获得完整的结果。