【问题标题】:Get max of grouped documents in CosmosDb在 CosmosDb 中获取最大的分组文档
【发布时间】:2022-12-05 11:30:53
【问题描述】:

我要查询Azure Cosmos 数据库文件与数据库接口询问。这些文档应按特定值进行过滤和分组。从这些组中,只应返回具有指定最大值的文档。

例子

Azure CosmosDb 文档

{
  "id": "1",
  "someValue": "shall be included",
  "group": "foo",
  "timestamp": "1668907312"
}
{
  "id": "2",
  "someValue": "shall be included",
  "group": "foo",
  "timestamp": "1668907314"
}
{
  "id": "3",
  "someValue": "shall be included",
  "group": "bar",
  "timestamp": "1668907312"
}
{
  "id": "4",
  "someValue": "don't include",
  "group": "bar",
  "timestamp": "1668907312"
}

询问

我想获取所有文件

  • "someValue": "shall be included"
  • group分组
  • 仅来自最多 timestamp

示例响应

{
  "id": "2",
  "someValue": "shall be included",
  "group": "foo",
  "timestamp": "1668907314"
},
{
  "id": "3",
  "someValue": "shall be included",
  "group": "bar",
  "timestamp": "1668907312"
}

问题

做这个的最好方式是什么?这将是最佳如果

  • 在一个查询中是可能的
  • 并使用 SqlParameter 与 Azure SDK 一起执行(以防止注入)

我试过的

我当前的方法包含 2 个查询并使用 ARRAY_CONTAINS,这不允许将 SqlParameter 用于文档路径。

{
  "id": "2",
  "some-value": "shall be included",
  "group": "foo",
  "timestamp": "1668907314"
}

第一个查询

SELECT c.group AS group
    MAX(c.timestamp) AS maxValue
    FROM c
    WHERE c.someValue = 'shall be included'
    GROUP BY c.group

第二个查询

SELECT * FROM c WHERE ARRAY_CONTAINS(
        <RESULT-FIRST-QUERY>,
        {
        "group": c.group,
        "maxValue": c.timestamp
        },
        false
    )

【问题讨论】:

    标签: azure azure-cosmosdb azure-cosmosdb-sqlapi azure-sdk-for-java


    【解决方案1】:

    我会将 MAX() function 与 GROUP BY 结合使用,即

    SELECT *
    FROM c
    WHERE c.someValue = "shall be included"
    GROUP BY c.group
    HAVING MAX(c.timestamp)
    

    还没有运行/需要收集,但似乎应该可以解决问题...

    【讨论】:

      猜你喜欢
      • 2018-08-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-07-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-07-20
      相关资源
      最近更新 更多