0

我有一个文件:

{
  contact: {
    id: '123'
  },
  channels: [
    {
      ... some channel info...
    }
  ],
  lastUpdatedEpoch: 1583937675
}

我有以下不返回上述文档的查询:

SELECT p FROM p JOIN c IN p.channels
WHERE (NOT IS_DEFINED(p.lastUpdatedEpoch) OR p.lastUpdatedEpoch < 1585733881)
AND p.contact.id = '123'

但是当我删除 NOT IS_DEFINED 检查时,它会正确返回文档:

SELECT p FROM p JOIN c IN p.channels
WHERE (p.lastUpdatedEpoch < 1585733881)
AND p.contact.id = '123'

我还尝试将 NOT IS_DEFINED 子句替换为 FALSE 并返回文档:

SELECT p FROM p JOIN c IN p.channels
WHERE (FALSE OR p.lastUpdatedEpoch < 1585733881)
AND p.contact.id = '123'

此外,如果我删除 JOIN,查询将按预期工作并返回文档:

SELECT p FROM
WHERE (NOT IS_DEFINED(p.lastUpdatedEpoch) OR p.lastUpdatedEpoch < 1585733881)
AND p.contact.id = '123'

对我来说,这种行为是出乎意料的。定义 lastUpdatedEpoch 时,我希望第一个和第二个查询的结果相同(除了 NOT_ISDEFINED 将导致不使用索引这一事实之外)。有人可以解释一下这里发生了什么吗?

4

2 回答 2

0

我尝试在我这边重现您的问题,但失败了。结果对我来说是预期的。

测试样本数据:

在此处输入图像描述

Sql 输出:

在此处输入图像描述

看来你没有引用任何列。channels我建议你创建一些简单的测试数据来验证你的sql是否正确。然后尝试与你的实际数据进行比较。

于 2020-04-02T06:36:14.800 回答
0

我联系了 CosmosDB 团队,该团队能够就该问题提供一些见解。最近进行了新的优化,以允许不等式和 NotIsDefined 表达式利用索引。此优化存在一些问题,团队暂时禁用了此功能。如果您能够在集群中观察到此问题,请联系他们的支持团队。

于 2020-04-08T16:48:23.963 回答