如何为 CosmosDB 文档中的数组元素起别名?

How to alias array elements in CosmosDB documents?

我有以下文件,

{
        "VehicleDetailId": 1,
        "VehicleDetail": [
            {
                "Id": 1,
                "Make": "BMW"
            },
            {
                "Id": 1,
                "Model": "ABDS"
            },
            {
                "Id": 1,
                "Trim": "5.6L/ASMD"
            },
            {
                "Id": 1,
                "Year": 2008
            }
        ]
}

我想给数组元素起别名,像这样,

{
        "VehicleDetailId": 1,
        "Type": "VehicleDetail",
        "VehicleDetail": [
            {
                "MakeId": 1,
                "MakeValue": "BMW"
            },
            {
                "ModelId": 1,
                "ModelValue": "ABDS"
            },
            {
                "TrimId": 1,
                "TrimValue": "5.6L/ASMD"
            },
            {
                "YearId": 1,
                "YearValue": 2008
            }
        ]
}

以下查询似乎工作正常,但由于 Id 对所有人都是通用的,因此每次都会重复。

SELECT c.vehicleDetailId, ARRAY(SELECT v.Id AS MakeId, v.Make AS MakeValue,
                                       v.Id AS ModelId, v.Model AS ModelValue,
                                       v.Id AS TrimId, v.Trim AS TrimValue,
                                       v.Id AS YearId, v.Year AS YearValue
                                FROM v IN c.VehicleDetail) AS VehicleDetail 
FROM c

查询应该怎么写才不会每次重复Id,并且可以从特定位置取到元素?

您可以使用 UDF 来实现您的需求。

Udf代码:

function userDefinedFunction(array){
    var returnArray = [];
    for(var i=0;i<array.length;i++){
        var obj = array[i];
        var map = {};
        if(obj.Make){
            map["MakeId"]= obj.Id;
            map["MakeValue"]= obj.Make;
        }else if(obj.Model){
            map["ModelId"]= obj.Id;
            map["ModelValue"]= obj.Model;
        }else if(obj.Trim){
            map["TrimId"]= obj.Id;
            map["TrimValue"]= obj.Trim;
        }else if(obj.Year){
            map["YearId"]= obj.Id;
            map["YearValue"]= obj.Year;
        } 
        returnArray.push(map);
    }
    return returnArray;
}

Sql:

SELECT c.VehicleDetailId,udf.test(c.VehicleDetail) AS VehicleDetail 
FROM c

输出: