【问题标题】:Does cosmos SQL support a way to query using the AltLink?cosmos SQL 是否支持使用 AltLink 进行查询的方式?
【发布时间】:2019-09-02 04:17:29
【问题描述】:

我想知道是否有任何方法可以使用 AltLink 而不是 SelfLink 进行查询?

SELECT * FROM c
--WHERE c._alt = 'dbs/DefaultDb/colls/DefaultColl/docs/cd9d67d5-b82e-4ec5-aad3-91e784906f6e'
WHERE c._self = 'dbs/Rr4MAA==/colls/Rr4MAOW90GI=/docs/Rr4MAOW90GIBAAAAAAAAAA==/'

更新:

我正在寻找一种在 SQL 中使用 AltLink 的方法的原因是由于通过其 id 对文档进行简单查询的问题将随着集合的增长而不断增加成本。 .net SDK 允许使用 AltLink 来获取文档,成本几乎总是在 1 到 1.5 RU 之间。

RUCost.png

【问题讨论】:

  • 只是好奇你为什么需要做这样的查询。你想解决什么问题?
  • 如果您可以对集合运行查询,那么除了 id 之外您不需要其他任何东西来查找文档,因此 alt 链接的想​​法实际上没有意义,但我可能会遗漏一些东西
  • David Makogon,问题是我的收藏有 10,000 个文档。如果我通过那里的 id 查询文档,则 RU 成本为 277。如果我通过 SelfLink 查询,成本为 1.2 RU。如果我通过文档 ID 和文档类型(它的枚举)查询,则 RU 成本为 2.4。使用 SelfLink 和 AltLink 据说是检索文档的最快和最便宜的方法。
  • @user6196566 - 尝试按文档 id 进行 read (当您知道 id 时,查询总是比读取成本更高)。这(阅读)是阅读文档的最便宜的(RU-wise)。不是查询。
  • Nick Chapsas,很高兴收到您的来信!在过去的几个月里,我在 cosmos db 中进行原型设计时,已经阅读了您在 stackoverflow 上的许多帖子。我的问题 Nick 是 .net SDK 有一个名为 ReadDocumentAsync 的方法。此方法通过其 Id 返回单个文档。我无法让 cosmos 模拟器高效地返回相同的记录。使用 SelfLink 似乎最快,但要使用 self 链接,我必须知道要查找的 RId uim。目前我只在子文档中存储父母 ID,而不是父母的 RId。

标签: azure-cosmosdb azure-cosmosdb-sqlapi


【解决方案1】:

在您理解为什么您的要求没有意义之前,我需要向您说明一些事情。

使用 self/alt 链接和分区键值的直接读取总是比使用 self/alt 链接和分区键值的查询更有效。这正是 Cosmos 的工作方式。

您所要求的最初甚至不可能的原因是因为 id 值在集合中不是唯一的。只要它们位于不同的逻辑分区中,您就可以拥有具有相同id 的无限项(这意味着您的id 值仅在其自己的逻辑分区中是唯一的)。

这意味着在这种情况下,集合中每个文档的AltLink 将完全相同。服务器如何知道您真正想要哪个文档? SelfLink 也是如此,因为它使用资源 ID,所以每个文档都是唯一的。但是,除非您将其指向逻辑分区,否则服务器无法知道此资源 ID 所在的位置。

您应该按照您的要求进行操作,即使用 SDK 的 Read 方法或 REST API 的 Read 方法,以及您要查找的分区键值。

【讨论】:

  • 好的,所以要清楚一点。获取父级及其子级的最佳方法是首先直接读取以获取父文档。然后做一个文档查询来获得无限数量的孩子?我们是否应该将子项的 Rids 存储在父项下以便我们不需要查询?如果我考虑一下,来自查询的 100 个文档的成本约为 7 RU,而 100 个单独的读取成本为 100 RU。
猜你喜欢
  • 2020-09-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-03-09
  • 1970-01-01
  • 2010-09-10
  • 2019-08-21
相关资源
最近更新 更多