【问题标题】:Azure Cosmos UDF to return default value if key doesnt exist如果键不存在,Azure Cosmos UDF 返回默认值
【发布时间】:2019-03-05 20:00:19
【问题描述】:

我在 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";
  }
}

如果图片 url 为空白,我会返回此返回(正确):

{
    "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 键不存在,我仍然返回默认值?

【问题讨论】:

  • 嗨,我的回答对你有帮助吗?蜡笔。
  • 没有,请看我下面的回复。
  • 好的。很高兴你已经解决了你的问题。

标签: azure azure-cosmosdb user-defined-functions


【解决方案1】:

首先,您提供的示例文档是不正确的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

【讨论】:

    【解决方案2】:

    感谢@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;
    }
    

    【讨论】:

      猜你喜欢
      • 2011-02-05
      • 1970-01-01
      • 2014-06-17
      • 2012-03-22
      • 1970-01-01
      • 2017-03-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多