查询 Cosmos DB 的正确方法 Table

Correct way to query a Cosmos DB Table

我正在尝试使用 Cosmos DB Tables。我注意到的是,如果我查询 Timestamp 属性,则不会返回任何数据。

这是我正在使用的查询:

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

我相信我的查询是正确的,因为对于我的存储帐户中的 table,相同的查询 运行 完全没问题。

如果我查询任何其他属性,查询 运行 完全没问题。

我在 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 Table 的正确方法是什么?

更新

似乎这不仅仅是 Timestamp 属性 的问题,而是所有 Edm.DateTime 种属性的问题。


更新#2

所以我打开了我的 Cosmos DB Table 帐户作为 SQL API 帐户以查看数据实际上是如何存储的。

我观察到的第一件事是 Timestamp 属性 根本没有被存储。 Timestamp 的值(在存储 Table 实体中)实际上存储为 _ts 系统 属性 并且也存储为 Epoch 秒。

接下来我注意到所有 Date/Time 类属性实际上都被转换为 20 个字符长的字符串,并存储如下内容:

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

我想知道这是否与无法直接发出 ODATA 查询有关。

顺便说一句,我忘了说我正在使用 Azure 存储节点 SDK 访问我的 Cosmos Table 帐户(考虑到没有专门针对 Table 的节点 SDK,微软建议这样做=65=]).

感谢您在我调查此问题时的耐心等待。

此行为的根本原因是存储 table 以滴答时间粒度存储,而 Cosmos DB 的 _ts 处于第二粒度级别。这与 OData 无关。我们实际上阻止了对时间戳属性的查询,因为它会让客户感到困惑,并且不建议对存储表使用基于时间戳的整体查询。

解决方法是添加您自己的自定义日期时间或长数据类型 属性 并从客户端自行设置值。

我们将在以后的更新中解决这个问题,但目前还没有安排这项工作。

谢谢。