【问题标题】:Efficient way to query multiple documents of Azure Cosmos DB查询 Azure Cosmos DB 多个文档的高效方法
【发布时间】:2021-06-18 22:39:52
【问题描述】:

我正在将数据存储到 cosmos DB 中,如下所示,我想获取每个索引的最新数据。 索引的数量是可变的,至少10个。

(简化文档)

{
    "receivedTime": "2021-06-11T01:48:02.751Z",
    "source": "server",
    "data": {
        "index": "1",
        "value": "my data"
    },
    "id": "c10ef6dc-53a6-40e0-84d1-551e508d0427",
}

目前,我正在查询索引的数量并显示每个索引的结果。

(只有c.data.index = '<index>'不同,其他相同。)

SELECT * FROM c WHERE c.source = 'server' AND c.data.index = '1' ORDER BY c._ts DESC OFFSET 0 LIMIT 1,
SELECT * FROM c WHERE c.source = 'server' AND c.data.index = '2' ORDER BY c._ts DESC OFFSET 0 LIMIT 1,
SELECT * FROM c WHERE c.source = 'server' AND c.data.index = '3' ORDER BY c._ts DESC OFFSET 0 LIMIT 1,
...

但是随着索引数量的增加,会有延迟。

有什么方法可以一次性查询全部吗?

有没有更高效的方式查询多个文档?

我正在使用 Node.js SDK。

【问题讨论】:

  • 您对结果应该有多近有期望吗?如果要尝试的一件事是对比最近某个时间点更新的所有内容进行简单查询,则从结果集中挑选出您想要的项目。
  • @NoahStahl 每个索引的文档都是随机存储的。所以我认为简单的查询很难,但我会尝试。谢谢你的提示。
  • SELECT c.data.index,max(c._ts) as _ts FROM c group by c.data.index 但无法返回 *
  • @TinyWang 我试过查询,但花了很长时间,请求费用增加了。 (大约 200,000 RU)可能是大量文档的原因吗?
  • 我不是这个原因,我从来没有遇到过这么大的数据目标QAQ.....@NoahStahl 先生你能给点建议吗?我认识你是 Cosmosdb 的专家。非常感谢您的任何建议。

标签: sql node.js azure azure-cosmosdb


【解决方案1】:

复杂查询的一种替代方法是创建一个materialized view,这将使该操作变得简单而高效。如果要知道每个 index 值的最新项目,我们可以创建一个名为 LatestByIndex 的单独容器,并使用更改提要来填充每个索引值的最新项目的副本或引用.

为了促进高效读取,LatestByIndex 项目可以使用关联的index 值作为它们的id。然后找到最新的索引x 可以通过读取idx 来完成。该项目可以是原始项目的副本或引用。

实现将是一个更改提要处理器,每次观察到主容器中的更改时,它都会覆盖LatestByIndex 中的项目。您可能还需要一项补充性维护工作,该工作会定期刷新最新信息,作为对更改源同步的备份健全性检查。

【讨论】:

  • Ok.. 可能需要更改文档结构才能使用该方法。我会尽力。感谢您的建议。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-05-07
  • 1970-01-01
相关资源
最近更新 更多