azure - 查询特定格式

标签 azure azure-cosmosdb azure-cosmosdb-sqlapi

我在 Azure CosmosDB NoSQL 中有集合,文档如下所示:

{
    "Name": "A1",
    "Tag": "Extra",
    "Daily_data": {
        "2010-01-01": {
            "Value1": {
                "P1": 200,
                "P2": 100,
                "P3": 250,
                "P4": 110
            },
            "Value2": {
                "P1": 200,
                "P2": 100,
                "P3": 250,
                "P4": 110
            }
        },
        "2010-01-02": {
         "Value1": {
                "P1": 200,
                "P2": 100,
                "P3": 250,
                "P4": 110
            },
        "Value2": {
                "P1": 200,
                "P2": 100,
                "P3": 250,
                "P4": 110
            }
        }
    }
}

我正在尝试创建 SQL 查询来为每个文档获取此格式的数据:

{
    "Name": "A1",
    "Tag": "Extra",
    "Daily_data": [
        {
        "Date": "2010-01-01",
        "Values": [
            {
               "Value": "Value1",
                "P1": 200,
                "P2": 100,
                "P3": 250,
                "P4": 110
            },
            {
                "Value": "Value2",
                "P1": 200,
                "P2": 100,
                "P3": 250,
                "P4": 110
            }
        ]
    },
    {
        "Date": "2010-01-02",
        "Values":[
            {
               "Value": "Value1",
               "P1": 200,
               "P2": 100,
               "P3": 250,
               "P4": 110
            },
            {
                "Value": "Value2",
                "P1": 200,
                "P2": 100,
                "P3": 250,
                "P4": 110
            }
        ]
    }
    ]
}

所以基本上我想将键值对更改为一个值列表,其中键作为其中的值之一。

我尝试首先使用以下代码获取键列表,但它返回空字符串。知道如何创建此查询吗?

SELECT 
    c.Name,
    c.Tag,
    ARRAY(
        SELECT {
            "Date": item.Key
        }
        FROM item IN c.Daily_data
    ) AS Daily_data
FROM c

最佳答案

我不知道如何使用 SQLAPI SQL 查询工具集枚举 JSON 属性键的任何技巧。没有什么美丽和神奇的东西..

正确的答案是与“业务”坐下来,向他们解释如果他们想要合理的开发成本和性能,存储模型必须不同;)只要“业务”能够得到他们的模型位于边缘,他们不应该关心数据如何存在于底层。就像 David Makogon 所建议的那样,将数据从键转移到值(或许还可以将数据拆分为更小的文档)很可能会将您/他们从 future 的痛苦世界中拯救出来。

如果“企业”真的愿意无休止地为更丑陋/更昂贵/更慢的解决方案付费,那么您可以尝试..

选项 1:用户定义的函数。

您很可能可以使用 Javascript 随意转换模型。缺点是开发和执行它成本高昂且繁琐。但这对你来说可能是一个肮脏的临时技巧,并将 json 对象键转换为数组,甚至转换整个模型。从这里开始:User-defined functions (UDFs) in Azure Cosmos DB .

选项 2:每次使用时在客户端应用中进行转换

只需按原样获取文档并使用 C#/JS 或您拥有的任何客户端在客户端实现转换逻辑即可。缺点是您必须将完整的文档加载到客户端,即使您的逻辑会进一步过滤/转换/聚合模型。但是,根据您的使用模式,这可能就足够了......至少它为您赢得了时间。

选项 3:在客户端进行转换,写入单独的数据库

如果你真的喜欢过度设计,你也可以使用 change feed并将转换后的模型连续写入另一个容器,以便稍后查询/转换/聚合。这样,您只需为转换“付费”一次,即可获得使用 cosmos SQLAPI 的所有读取优势。

但是会存在维护更改源流程、同步问题(更改源不传递删除)等麻烦。拥有共享吞吐量数据库可以帮助您避免侧容器的额外成本。

关于azure - 查询特定格式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/76304929/

相关文章:

azure - 无需停机即可升级 Azure AKS

azure - 如何通过脚本删除 Azure Databricks 工作区

javascript - Azure函数更新文档中的CosmosDB SQL数组

javascript - 如何根据条件从 COSMOS DB 中选择记录

python - 如何使用Python将批量数据插入Cosmos DB?

sql - Cosmos DB SQL 嵌套数组查询

c# - 与互联网断开连接时卡在 UploadFromStream 中

azure - Azure Function App 是否可以通过 VPN 或混合连接访问本地资源?

Azure Functions 在与 Azure Cosmos DB 或 SQL 数据库结合进行负载测试时失败

c# - 将 GraphQL 查询映射到 Select() linq 到 sql