Azure cosmosdb Cosmos数据库查询投影
我有以下格式的Cosmos文件: 注意:示例仅用于说明,实际文档具有不同的属性Azure cosmosdb Cosmos数据库查询投影,azure-cosmosdb,azure-cosmosdb-sqlapi,Azure Cosmosdb,Azure Cosmosdb Sqlapi,我有以下格式的Cosmos文件: 注意:示例仅用于说明,实际文档具有不同的属性 { "OrderNumer":"12345", "Version":"5", "OrderDetails": [ { "id":1, "OrderItem": { "Name": "ABC", "Des
{
"OrderNumer":"12345",
"Version":"5",
"OrderDetails": [
{
"id":1,
"OrderItem": {
"Name": "ABC",
"Description": "ABC Description",
.
.
.
},
"PaymentDetails": {
},
.
.
.
},
{
"id":2,
"OrderItem": {
"Name": "PQR",
"Description": "PQR Description",
.
.
.
},
"PaymentDetails": {
},
.
.
.
},
],
"OrderDate": "12-01-2020",
"CustomerDetails": {
}
.
.
.
}
OrderNumber是一个分区键
我试图通过Cosmos查询将上面的文档投影到一个JSON中,以获得整个OrderDetails JSON对象和父对象的一些属性,并在OrderDetails->id上使用一个过滤器
预期预测应为:
{
"Order":
[
{
"OrderNumer":"12345",
"Version":"5",
"id":1,
"OrderItem": {
"Name": "ABC",
"Description": "ABC Description",
.
.
.
},
"PaymentDetails": {
},
.
.
.
},
{
"OrderNumer":"12345",
"Version":"5",
"id":2,
"OrderItem": {
"Name": "PQR",
"Description": "PQR Description",
.
.
.
},
"PaymentDetails": {
},
.
.
.
},
]
}
如上面的JSON所示,我将OrderDetails中的OrderNumber和Version属性投影为Order
OrderDetails是一个具有动态模式的大型JSON,这使得我们很难单独投影其属性
我尝试了几个选项来预测这一点,但最接近的是下面的查询:
SELECT c.OrderNumber, c.Version, o as Order
FROM c
JOIN o in c.OrderDetails WHERE
c.OrderNumber= '1235' AND ARRAY_CONTAINS([1,2], o.id)
但是,上面的查询没有给出所需的结果,因为它将OrderNumber和Version作为单独的属性保留在Order中
有什么方法可以实现这一点吗?您可以使用UDF
首先:创建一个udf,下面是代码
function Converted(version,orderNumber,orderItem){
orderItem.Version = version;
orderItem.OrderNumber = orderNumber;
return orderItem;
}
第二:使用这个sql
select value udf.Converted(c.Version,c.OrderNumber,o) from c join o in c.OrderDetails WHERE c.OrderNumber= '12345' AND ARRAY_CONTAINS([1,2], o.id)
最后:新的JsonObject通过代码添加这个结果
结果如下:
[
{
"id": 1,
"OrderItem": {
"Name": "ABC",
"Description": "ABC Description"
},
"PaymentDetails": {},
"Version": "5",
"OrderNumber": "12345"
},
{
"id": 2,
"OrderItem": {
"Name": "PQR",
"Description": "PQR Description"
},
"PaymentDetails": {},
"Version": "5",
"OrderNumber": "12345"
}
]
这符合您的要求吗?我知道现在回答这个问题已经太迟了,直到现在您已经解决了问题,但仍然提供查询以帮助可能遇到类似问题的其他人 CosmosDB提供了灵活性,可以帮助您修改输出JSON结构。以上问题请参见下面的查询 查询:
SELECT
[
{
"OrderNumer": c.OrderNumer,
"Version": c.Version,
"id": od.id,
"OrderItem": {
"Name": od.OrderItem.Name,
"Description": od.OrderItem.Description
}
}
] AS Orders
FROM c
JOIN od IN c.OrderDetails
快乐编码 请编辑您的问题,包括您目前编写的查询,并告诉我们您遇到的问题。尝试以下sql:从c中选择c.OrderNumer、c.Version、o.OrderItem、o.PaymentDetails,然后在c.OrderDetails中加入o,然后新建JsonObject通过代码添加此结果。您尝试过@SteveZhao发布的查询吗?这个查询没有满足我的一个要求,我需要OrderDetails中的所有属性,OrderDetails有一个巨大的动态数据集。所以我更喜欢整体选择。希望这能澄清这是个好主意。谢谢你的建议。我想这种方法的一个问题是我们需要在Javascript中创建一个单独的udf。该函数需要以与代码其余部分不同的方式执行/部署。我们使用C Cosmos SDK对Cosmos文档执行所有操作。我们尽量避免使用存储过程、触发器和UDF。现在,这将是一个例外。你认为这是唯一的办法吗?如果是这样的话,我更倾向于创建一个单独的POCO文档来反序列化它,而不是创建一个UDF。我很高兴听到这对你有帮助。据我所知,这是唯一的方法。我尝试了很多sql,但都不起作用。我想这并不能回答我的问题。