我正在尝试使用 Cosmos DB 表。我注意到的是,如果我查询Timestamp
属性,则不会返回任何数据。
这是我正在使用的查询:
Timestamp ge datetime'2010-01-01T00:00:00'
我相信我的查询是正确的,因为相同的查询在我的存储帐户中的表上运行得非常好。
如果我查询任何其他属性,查询运行得非常好。
我尝试在 Cerebrata Cerulean 和 Microsoft Storage Explorer 中运行此查询,但在这两个地方都没有得到任何结果。
但是,当我在 Azure 门户数据资源管理器中运行相同的查询时,会返回数据。我在 Azure 门户中打开了开发人员工具,发现门户没有进行 OData 查询。相反,它正在进行 SQL API 查询。例如,在上述情况下,正在发送的查询是:
Select * from c where c._ts > [epoch value indicating time]
同样,如果我使用上述工具查询属性:
AttributeName eq 'Some Attribute Value'
在 Azure 门户中发送相同的查询
SELECT * FROM c WHERE c.AttributeName["$v"] = 'Some Attribute Value'
所有文档都指出我应该能够编写 OData 查询并且它们应该可以工作,但我认为它不正确。
那么查询 Cosmos DB 表的正确方法是什么?
更新
似乎这不仅仅是Timestamp
属性的问题,而是所有Edm.DateTime
类型的属性。
更新#2
因此,我将我的 Cosmos DB 表帐户作为 SQL API 帐户打开,以查看数据实际上是如何存储在后台的。
我观察到的第一件事是Timestamp
财产根本没有被存储。(在存储表实体中)的值Timestamp
实际上被存储为_ts
系统属性,也被存储为Epoch
秒。
接下来我注意到的是,所有日期/时间类型的属性实际上都被转换为 20 个字符长的字符串,并存储如下:
"SourceTimestamp": {
"$t": 9,
"$v": "00637219463290953744"
},
我想知道这是否与无法直接发出 ODATA 查询有关。
顺便说一句,我忘了提到我正在使用 Azure Storage Node SDK 来访问我的 Cosmos Table 帐户(因为这是微软推荐的,因为没有专门用于 Table API 的 Node SDK)。