Cosmos DB查询投影

时间:2020-06-05 05:27:18

标签: azure-cosmosdb azure-cosmosdb-sqlapi

我有以下格式的Cosmos文档:

注意:示例仅用于说明,实际文档具有不同的属性)

import java.util.Comparator;;
import java.util.stream.Collectors;

Arrays.asList(files).stream()
    .sorted(Comparator.comparing(File::getLastModified).reversed())
    .collect(Collectors.toList());

{ "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": { } . . . } 是分区键。

我正在尝试通过Cosmos Query投影以上文档,以将整个OrderNumber JSON对象和父级的一些属性转换为单个JSON,并在OrderDetails-> { 1}}。

预期的预测应该是:

OrderDetails

如上面的JSON所示,我将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": { }, . . . }, ] } OrderNumber属性投影为Version

OrderDetails是具有动态模式的大型JSON,这使我们难以单独投影其属性。

我尝试了一些方法来对此进行投影,但最接近的查询是在查询下方:

Order

但是,上述查询无法提供理想的结果,因为它将OrderDetailsSELECT 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的单独属性。

有什么办法可以做到这一点?

2 个答案:

答案 0 :(得分:2)

您可以使用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"
    }
]

这符合您的要求吗?

答案 1 :(得分:-1)

我知道现在回答这个问题为时已晚,直到现在您已经解决了问题,但仍在提供查询以帮助可能遇到类似问题的其他人。

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

祝您编程愉快!