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

标签 azure azure-cosmosdb user-defined-functions

我在 Cosmos 中有一个文档结构,通常如下所示:

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

有时,图像值会为空。我编写了一个 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['项目编号'], c['项目描述'], udf.missingImage(c.images[0]) 作为图像”

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

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

我没有恢复默认设置。

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

最佳答案

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

关于如果 key 不存在,Azure Cosmos UDF 将返回默认值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55010622/

相关文章:

azure - 是否有用于 azure 机器学习服务的 Java SDK?

mysql - MySQL用户定义函数

sql - 具有输出参数的存储过程与表值函数?

azure - 如何在单个 ARM 模板中部署带有规则引擎的 Front Door

azure - 我们可以从管道 azure synapse 在无服务器池中执行 sql 查询吗?

azure-cosmosdb - 是否可以在 CosmosDB 中存储和查询数组空间数据?

c# - Azure 函数 C# : Create or replace document in cosmos db on HTTP request

c# - CosmosDb LINQ 查询 'any' 不起作用,但 'count() > 0' 起作用?

c++ - 使用 C++ STL 功能编写 MySQL UDF

node.js - 如何使用绑定(bind)更新 Azure 函数中的 Azure 表行?