查询 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 无关。我们实际上阻止了对时间戳属性的查询,因为它会让客户感到困惑,并且不建议对存储表使用基于时间戳的整体查询。
解决方法是添加您自己的自定义日期时间或长数据类型 属性 并从客户端自行设置值。
我们将在以后的更新中解决这个问题,但目前还没有安排这项工作。
谢谢。
我正在尝试使用 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 无关。我们实际上阻止了对时间戳属性的查询,因为它会让客户感到困惑,并且不建议对存储表使用基于时间戳的整体查询。
解决方法是添加您自己的自定义日期时间或长数据类型 属性 并从客户端自行设置值。
我们将在以后的更新中解决这个问题,但目前还没有安排这项工作。
谢谢。