Я пытаюсь использовать таблицы БД 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 не существует).