Правильный способ запроса таблицы БД Cosmos - PullRequest
0 голосов
/ 26 апреля 2020

Я пытаюсь использовать таблицы БД Cosmos. Что я заметил, так это то, что если я запрашиваю свойство Timestamp, данные не возвращаются.

Вот запрос, который я использую:

Timestamp ge datetime'2010-01-01T00:00:00'

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

Если я запрашиваю любой другой атрибут, запрос выполняется отлично.

Я попытался выполнить этот запрос как в Cerebrata Cerulean, так и в Microsoft Storage Explorer и я не получаю результатов в обоих местах.

Однако, когда я запускаю один и тот же запрос в Azure Portal Data Explorer, данные возвращаются. Я открыл инструменты разработчика на портале Azure и заметил, что портал не выполняет запрос OData. Вместо этого он делает SQL запрос API. Например, в вышеприведенном случае отправляемый запрос выглядит так:

Select * from c where c._ts > [epoch value indicating time]

Аналогично, если я запрашиваю атрибут с использованием указанных выше инструментов:

AttributeName eq 'Some Attribute Value'

Тот же запрос отправляется в Azure Portal as

SELECT * FROM c WHERE  c.AttributeName["$v"] = 'Some Attribute Value'

Вся документация гласит, что я должен иметь возможность писать запросы OData, и они должны работать, но я не считаю это правильным.

Так что же правильный способ запроса таблиц Cosmos DB?

ОБНОВЛЕНИЕ

Похоже, это проблема не только для свойства Timestamp, но для всех свойств Edm.DateTime.


ОБНОВЛЕНИЕ # 2

Итак, я открыл свою учетную запись Cosmos DB Table как SQL учетную запись API, чтобы посмотреть, как данные на самом деле хранятся под капотом.

Первое, что я Замечено, что свойство Timestamp вообще не сохраняется. Значение Timestamp (в объекте таблицы хранения) фактически сохраняется как системное свойство _ts, а также как Epoch секунд.

Следующее, что я заметил, это то, что все свойства типа Дата / Время фактически преобразуется в строки длиной 20 символов и хранится примерно так:

"SourceTimestamp": {
    "$t": 9,
    "$v": "00637219463290953744"
},

Мне интересно, имеет ли это какое-то отношение к невозможности напрямую выдавать запросы ODATA.

Кстати, я забыл упомянуть, что я использую Azure Storage Node SDK для доступа к моей учетной записи Cosmos Table (поскольку это то, что Microsoft рекомендует, учитывая, что Node SDK специально для Table API не существует).

1 Ответ

1 голос
/ 29 апреля 2020

Спасибо за ваше терпение, пока я смотрел на это.

Причина root для такого поведения заключается в том, что таблица хранения хранит с временной гранулярностью тиков, _ts Cosmos DB находится на втором уровне гранулярности. Это не связано с OData. Мы фактически блокируем запросы для свойств отметки времени, потому что это сбивает с толку клиентов, и общие запросы на основе отметки времени не рекомендуются для таблиц хранения.

Обходной путь для этого - добавить собственное свойство типа datetime или long и установить значение самостоятельно из клиента.

Мы рассмотрим это в будущем обновлении, но эта работа в настоящее время не запланирована.

Спасибо.

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