Azure cosmosdb 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

我有以下格式的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查询将上面的文档投影到一个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,但都不起作用。我想这并不能回答我的问题。