【问题标题】:Efficient way to get Max number from CosmosDB从 CosmosDB 获取最大数量的有效方法
【发布时间】:2020-07-01 10:06:27
【问题描述】:

我有大量文档(约 200 万份)。我必须查询给定字典键的最高 num

对于给定键 '85642768',以下两个文档的预期输出将是 '3'

文档1:

{
    "id": "fb41ecd9-2761-41f4-87ca-aa4bf59f9d83",
    "Key": "Key123",
    "Dict": {
        "85642766": {
            "num": 1,
            "str": "str1"
        },
        "85642767": {
            "num": 1,
            "str": "str2"
        },
        "85642768": {
            "num": 2,
            "str": "str3"
        }
    }
}

文档2:

{
    "id": "821cf017-421a-422a-b082-45e77228dca3",
    "Key": "Key456",
    "Dict": {
        "85642766": {
            "num": 1,
            "str": "str1"
        },
        "85642767": {
            "num": 2,
            "str": "str2"
        },
        "85642768": {
            "num": 3,
            "str": "str3"
        }
    }
}

目前我有 250K 的唯一文档。我正在下载基于Key 列表的文档列表,每批 8000 个。在同一位置需要 14 分钟,10000 个 RU。

我也有一个基于Key 的索引。有没有更好的方法来减少搜索时间?

【问题讨论】:

  • CosmosDB 是一个数据库。您无需下载所有文档并在本地处理它们,而是向其发送查询以生成结果。 250K 几乎没有数据——笔记本电脑上的小型 SQL Server 数据库可以处理 GB 的数据。
  • CosmosDB allows querying using SQL,包括 GROUP BY 和聚合函数。你试过吗?
  • 你写的代码会很有用,但我同意其他人的观点,听起来你正在下载所有数据以在本地处理它,而不是要求服务器产生答案。
  • 除了其他人所说的(您不应该下载整个集合来进行本地搜索和聚合):您应该重新考虑您的数据模型:您的 Dict 子文档正在使用键的值正如它的名字一样,这意味着没有实用的方法来搜索任意键。

标签: c# azure-cosmosdb


【解决方案1】:

正如上面的评论所说,你可以使用 sql 来做这件事。

请尝试类似这样的 sql:

SELECT value max(c.Dict["85642768"].num) from c

希望对你有帮助。

【讨论】:

    猜你喜欢
    • 2018-07-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-08-11
    • 1970-01-01
    相关资源
    最近更新 更多