Azure Предложение Cosmos DB (NOT IS_DEFINED OR) с JOIN всегда оценивается как ложное - PullRequest
0 голосов
/ 01 апреля 2020

У меня есть документ:

{
  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 приведет к тому, что индекс не будет использоваться). Может кто-нибудь объяснить, что здесь происходит?

Ответы [ 2 ]

0 голосов
/ 08 апреля 2020

Я связался с командой CosmosDB, и команда смогла дать некоторое представление о проблеме. Недавно была введена новая оптимизация, позволяющая неравенству и выражениям NotIsDefined использовать индекс. У этой оптимизации была некоторая проблема, и команда пока отключила эту функцию. Если вы можете наблюдать эту проблему в своем кластере, обратитесь в службу поддержки.

0 голосов
/ 02 апреля 2020

Я пытаюсь воспроизвести вашу проблему на моей стороне, но не удалось. Результат ожидается для меня.

Данные тестового образца:

enter image description here

Sql Вывод:

enter image description here

Похоже, вы не ссылались ни на какие столбцы в channels. Я предлагаю создать какой-то простой тест данные, чтобы проверить, правильно ли ваш sql. Затем попытайтесь сравнить с вашими фактическими данными.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...