2

我在 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 集合。

我仅从 Azure 门户创建 DB 和 Trigger 函数。我在这里搜索了一个解决方案,但我在任何地方都没有看到通过 azure 门户创建触发功能的解决方案。

4

1 回答 1

1

每当您想通过 Azure 触发函数更新 cosmosDB 中已存在的记录时,应注意以下几点。

  1. 检查数据库集合中存在的名为id的元素是否存在唯一键
  2. 更新插入时为唯一键更新的数据的id应该相同。

如果元素id不同,那么在更新插入时 cosmos 将为该元素分配一个新值,我们将有 2 个条目用于具有不同id的唯一键并抛出上述错误。

于 2019-06-19T06:23:32.200 回答