UDF Azure Cosmos возвращает значение по умолчанию, если ключ не существует - PullRequest
1 голос
/ 05 марта 2019

У меня есть структура документа в Космосе, которая обычно выглядит следующим образом:

{
    "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 не существовал, я все равно возвращал значение по умолчанию?

Ответы [ 2 ]

0 голосов
/ 09 марта 2019

Спасибо @ jay-gong за ваше время и ответ, однако это не решает проблему.Я ищу способ вернуть значение по умолчанию, когда в документе вообще нет ключа images.

Я чувствую, что ответ здесь не будет проходить через UDF, скорее, ему потребуетсябыть адресованным на уровне запроса.Я основываюсь на том факте, что, если я напрямую верну значение по умолчанию, как вы увидите в приведенном ниже примере UDF, я не вернусь images независимо.

Документ в Космосе:

{
    "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;
}
0 голосов
/ 07 марта 2019

Во-первых, предоставленный вами образец документа имеет неправильный формат 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

...