繁体   English   中英

如果密钥不存在,则Azure Cosmos UDF将返回默认值

[英]Azure Cosmos UDF to return default value if key doesnt exist

我在Cosmos中有一个文档结构,通常看起来像这样:

{
    "Item No": "123456",
    "Item Desc": "This is a description.",
    "images": {
        "https://somedomain.com/image1.png",
        "https://somedomain.com/image2.png",
    }
}

有时会有空的图像值,例如:

{
    "Item No": "123456",
    "Item Desc": "This is a description.",
    "images": {
        "",
        ""
    }
}

我已经编写了一个UDF(用户定义函数),它将使用默认值替换所有空值:

function missingImage(doc, prop) {
  if (typeof doc[prop] === "undefined" || doc[prop] === "" || doc[prop] === null) {
    return "https://via.placeholder.com/150";
  }
}

如果图片网址为空,我会得到以下返回信息(正确):

{
    "id": "e3842b29-313c-4a84-bc94-bc43a9a55742",
    "Item No": "123456",
    "Item Desc": "This is a description.",
    "image": "https://via.placeholder.com/150"
},

我的SELECT查询看起来像这样:

"c.id, c['Item No'], c['Item Desc'], udf.missingImage(c.images[0]) as image"

但是,在根本不存在图像键的情况下,例如:

{
    "Item No": "123456",
    "Item Desc": "This is a description."
}

我没有恢复默认值。

我的问题:如何修改我的UDF或查询,以便如果images键不存在,我仍然返回默认值?

首先,您提供的示例文档的json格式不正确。

在此处输入图片说明

我想应该是这样的:

在此处输入图片说明

您可以像这样修改udf函数:

function missingImage(images) {
    for(var i =0;i<images.length;i++){
         if (typeof images[i] === "undefined" || images[i] === "" || images[i] === null) {
            images[i] = "https://via.placeholder.com/150";
        }
    }
    return images;
}

然后使用sql确保结果中没有“”值:

SELECT udf.missingImage(c.images) FROM c

在此处输入图片说明

感谢@ jay-gong您的时间和回复,但这不能解决问题。 我正在寻找一种当文档中根本没有images键时返回默认值的方法。

我觉得这里的答案不是通过UDF,而是需要在查询级别解决。 我基于以下事实:如果直接返回默认值(如下面的UDF示例所示),则无论如何我都不会获取images

Cosmos中的文档:

{
    "id": "8fdc9f47-6209-455d-9b9c-482341bb3170",
    "Item No": "123456",
    "Item Desc": "This is a description."
}

UDF:

function missingImage(images) {
  return "https://via.placeholder.com/150";
}

查询:

SELECT c.id, c['Item No'], c['Item Desc'], udf.missingImage(c.images) FROM c

回报:

[
    {
        "id": "8fdc9f47-6209-455d-9b9c-482341bb3170",
        "Item No": "123456",
        "Item Desc": "This is a description."
    }
]

更新:我想出了一个解决方案,即使用IS_DEFINED来检查是否定义了images键。 如果不是,则返回false,这使我可以在UDF中采取措施。

查询:

SELECT c.id,
       c['Item No'],
       c['Item Desc'],
       udf.missingImage((IS_DEFINED(c.images) = true ? c.images : false)) 
FROM c

UDF:

function missingImage(images) {
  if (images == false) {
    return "https://via.placeholder.com/150";
  }
  return images;
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM