我在 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/