【问题标题】:Cosmos DB Query ProjectionCosmos DB 查询投影
【发布时间】:2020-09-24 06:28:25
【问题描述】:

我有以下格式的 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 投影上述文档,以获取整个 OrderDetails JSON 对象和来自父级的一些属性到单个 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 中的OrderNumberVersion 属性投影为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)

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

有什么方法可以实现吗?

【问题讨论】:

  • 请编辑您的问题并包含您目前编写的查询并告诉我们您遇到的问题。
  • 试试这个 sql:SELECT c.OrderNumer,c.Version,o.OrderItem,o.PaymentDetails FROM c join o in c.OrderDetails 然后new JsonObject 通过代码添加这个结果。
  • 你试过@SteveZhao 发布的查询吗?有效果吗?
  • 查询错过了我的一个要求,我需要来自OrderDetails 的所有属性,OrderDetails 有一个巨大的动态数据集。所以我更喜欢全选。希望这可以澄清

标签: azure-cosmosdb azure-cosmosdb-sqlapi


【解决方案1】:

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

这符合您的要求吗?

【讨论】:

  • 这是个好主意。谢谢你的建议。我想这种方法的一个问题是我们需要在 Javascript 中创建一个单独的udf。该功能需要以与其余代码不同的方式执行/部署。我们使用 C# Cosmos SDK 对 Cosmos 文档执行所有操作。我们尽量避免使用存储过程、触发器、UDF。现在,这将是一个例外。你认为这是唯一的方法吗?如果是这种情况,我更倾向于创建一个单独的 POCO 文档来反序列化它(而不是创建 UDF)。
  • 我很高兴听到这对你有帮助。据我所知,这是唯一的方法。我尝试了很多 sql,但它们不起作用。
【解决方案2】:

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

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

编码愉快!

【讨论】:

  • 不要认为它回答了我的问题。
猜你喜欢
  • 1970-01-01
  • 2018-12-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-12-28
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多