代码之家  ›  专栏  ›  技术社区  ›  Crayons

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

  •  0
  • Crayons  · 技术社区  · 7 年前

    我在宇宙中有一个文档结构,通常看起来是这样的:

    {
        "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."
    }
    

    我不能收回我的默认值。

    我的问题是: 如何修改自定义项或查询,以便 images 键不存在,是否仍返回默认值?

    0 回复  |  直到 7 年前
        1
  •  0
  •   Jay Gong    7 年前

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

    enter image description here

    我想应该是这样的:

    enter image description here

    您可以修改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
    

    enter image description here

        2
  •  0
  •   Crayons    7 年前

    感谢@jay gong为您提供的时间和回复,但是,这并不能解决这个问题。我正在寻找一种方法来返回一个默认值时没有 images 文档中根本不存在密钥。

    我觉得这里的答案不是通过UDF,而是需要在查询级别解决。我是基于这样一个事实,即如果我直接返回一个默认值,正如您将在下面的UDF示例中看到的那样,我不会返回 图像 不管怎样。

    宇宙中的文件:

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

    自定义项:

    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 检查 图像 密钥已定义。如果不是,返回false,这将给我在UDF中采取行动的东西。

    查询:

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

    自定义项:

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