【问题标题】:Cosmos db REST API order by with partitioningCosmos db REST API 通过分区排序
【发布时间】:2018-05-08 18:36:29
【问题描述】:

我正在使用 REST API 和 SQL for Cosmos db,需要返回按时间戳排序的查询结果(存储为 UNIX 数字时间戳)。我正在尝试使用简单的 ORDER BY 来做到这一点。

e.g. SELECT * FROM requests c ORDER BY c.timestamp

但是使用分区我得到错误:

"使用 TOP/ORDER BY 或聚合函数的跨分区查询不 支持。”

在集合设置中,字符串的索引精度设置为 -1,这是其他地方的建议,但仍然抛出错误。

如果我删除或设置为 false x-ms-documentdb-query-enablecrosspartition 标头,那么我会得到:

"需要跨分区查询,但已禁用。请设置 x-ms-documentdb-query-enablecrosspartition 为 true,指定 x-ms-documentdb-partitionkey,或修改您的查询以避免这种情况 例外。”

有没有人通过 SQL REST API 成功做到这一点?

谢谢。

【问题讨论】:

  • 确保你禁用跨分区查询,错误是说你不能使用 OrderBy 启用它
  • 如果我禁用跨分区查询,我会得到:“跨分区查询是必需的,但已禁用。请将 x-ms-documentdb-query-enablecrosspartition 设置为 true,指定 x-ms-documentdb-partitionkey,或修改您的查询以避免此异常。”
  • 这是一个非常古老的集合吗?在他们添加对 Order by 和 Top 的支持之前,这曾经是一个问题。

标签: azure azure-cosmosdb


【解决方案1】:

我在我这边重现您的问题。

然而,基于这个官方的statementjava sdk 和node.js sdk 支持TOPORDER BY 对分区集合的查询。我通过 sdk 测试了相同的查询,它可以工作。


更新答案:

我使用Flidder工具观察SDK的请求,发现包含三个请求。

一个:

当我运行上面的 sdk 代码时,第一个请求如下所示,其余的错误完全相同。但是,sdk 会为我重试以获取分区的_rid 属性。

两个:

我没有找到任何明确的官方解释。但是,在阅读了article之后,我想这里的交叉分区是指物理分区,而不是逻辑分区。因此,该请求有助于我们“摆脱”存储您的数据的物理分区和PartitionKeyRanges

三:

然后 sdk 使用附加属性为我发送更新请求:x-ms-documentdb-partitionkeyrangeid。并且查询结果正确返回。请注意最后一个请求中的更新sql。

我认为您可以模仿 SDK 为我们所做的请求来满足您的需求。

【讨论】:

  • 谢谢。是的,看起来 SDK 以某种方式支持此功能,但直接 SQL API 不支持,如果您使用的语言没有为它编写 SDK,这很烦人。
  • 谢谢,这很有用。我已经在代码中复制了它,它适用于 order by 和 top。对于将来发现此问题的任何其他人:要使用 /pkranges URL,您的授权标头需要使用“pkranges”作为资源类型。
  • 谢谢!这似乎很奇怪,这没有正式记录。虽然它看起来有点老套。
  • 这为我节省了大量的返工。谢谢你。令人沮丧的是,这不是通过 REST API 自动化或记录的! @chris-anderson-msft 全世界不使用 SDK 或通用平台。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-04-13
相关资源
最近更新 更多