Невозможно обновить коллекцию cosmosDB из функции запуска Azure - PullRequest
1 голос
/ 18 июня 2019

Я создал коллекцию в cosmosDB с уникальным ключом. В идеале коллекция должна обновляться новыми значениями, если в качестве входных данных для коллекции введен существующий ключ. У меня есть триггерная функция Azure cosmosDB, которая настроила вышеуказанную коллекцию как выходную.

Ниже приведен файл index.js, в котором реализована логическая реализация.

module.exports = async function (context, documents) {

    var StatusInput = context.bindings.StatusInput; //additional input

    if (!!documents && documents.length > 0) {
        var finalOutput = [];

    // logic implementation
    for(var i = 0; i < documents.length; i++){
            var document = documents[i];
            var baseID = document.id;
            baseTempJson = {};
            var abcValue = null;
            var xyzValue = null;

            const checkForID = obj => obj.id === baseID;

        if(!(StatusInput.some(checkForID))){

         if(!!document.abc  && document.abc !=null) {        
                        abcValue = document.abc;
          } if(!!document.xyz && document.xyz != null) {
                        xyzValue = document.xyz;
          }
        baseTempJson = {"id": baseID, "abc": abcValue, "xyz": xyzValue};
        finalOutput.push(baseTempJson);  

      } else 
            {
            StatusInput.forEach(function(element){
                var innerID = element.id;
                var tempJson = {};
                var abcValue = null;
                var xyzValue = null;

            if(innerID == baseID){
                    context.log('Data for the ID ' + innerID + ' is existing. Updating the values.');

                    if(!!document.abc  && document.abc !=null) {
                        abcValue = document.abc;
                    } if(!!element.abc && typeof document.abc == "undefined") {
                        abcValue = element.abc;
                    }
                    if(!!document.xyz && document.xyz != null) {
                       xyzValue = document.xyz;
                    }if(!!element.xyz && typeof document.xyz == "undefined") {
                       xyzValue = element.xyz;
                    }
                    tempJson = {"id": baseID, "abc": abcValue, "xyz": xyzValue};
                    finalOutput.push(tempJson); 
            }

            });
            }
    }
    context.bindings.StatusOutput = finalOutput;
    }
    context.done(); 
 }

Всякий раз, когда я запускаю функцию триггера, он выдает следующую ошибку, так как данные для уникального ключа уже есть в коллекции.


Entity with the specified id already exists in the system

Есть ли способ решить эту проблему и обновить коллекцию cosmosDB, если уникальный ключ уже существует в коллекции.

Я создаю функции DB и Trigger только на портале Azure. Я искал решение здесь, но нигде не видел решения, для которого функция запуска создана через портал Azure.

1 Ответ

1 голос
/ 19 июня 2019

Всякий раз, когда вы хотите обновить запись, если она уже существует в cosmosDB из функции триггера Azure, следует позаботиться о следующих пунктах.

  1. Проверьте наличие элемента с именем id в коллекции БД для уникального ключа
  2. Значение id должно быть одинаковым для данных, которые обновляются для уникального ключа при загрузке.

Если элемент id не то же самое, тогда при установке космоса будет назначено новое значение для этого элемента, и у нас будет 2 записи для уникального ключа с различными id s и киньте вышеуказанную ошибку.

...