首页 > 解决方案 > Cosmos DB 查询投影

问题描述

我有以下格式的 Cosmos 文档:

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

{
        "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 Query 投影上述文档,以将整个OrderDetailsJSON 对象和来自父级的一些属性放入一个带有过滤器的 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 所示,我在as中投影OrderNumberVersion属性。OrderDetailsOrder

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)

但是,上面的查询并没有给出想要的结果,因为它将OrderNumberand Versionin 作为单独的属性保留在Order.

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

标签: azure-cosmosdbazure-cosmosdb-sqlapi

解决方案


您可以使用 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)

最后:new 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"
    }
]

这符合您的要求吗?


推荐阅读