Функция Azure вставляет, но не обновляет cosmosDB - PullRequest
0 голосов
/ 26 февраля 2019

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

public static class Function1
{
    [FunctionName("Function1")]
    public static void Run([ServiceBusTrigger("ServiceBusQueue", AccessRights.Manage, Connection = "ServiceBusQueueConnection")]BrokeredMessage current, [DocumentDB(
            databaseName: "DBname",
            collectionName: "Colname",
            ConnectionStringSetting = "CosmosDBConnection")]out dynamic document, TraceWriter log)
    {
        document = current.GetBody<MyObject>(); 
        log.Info($"C# ServiceBus queue triggered function processed the message and sent to cosmos"); 
    }
}

Это успешно вставляет в космос, но при обновлении я получаю ошибки:

Microsoft.Azure.Documents.DocumentClintException: Entity with the specified id already exists in the system.

Они нажимают, я пытаюсьдля обновления используется ключ раздела этой коллекции.

Я видел этот вопрос: Функция Azure C #: создание или замена документа в dos cosmos по HTTP-запросу Но похоже, что мойиспользование аналогично тому, что в ответе Матиаса Карантаса.Также он упомянул, что использование параметра out вызывает рост космоса.

Как я могу создать эту функцию "upsert", все еще используя функцию Azure 1.x?

1 Ответ

0 голосов
/ 26 февраля 2019

Привязка действительно выполняет операцию Upsert.

Я создал этот пример функции, которая принимает полезную нагрузку Http (JSON) и сохраняет ее в базе данных Cosmos как есть:

[FunctionName("Function1")]
public static HttpResponseMessage Run([HttpTrigger(AuthorizationLevel.Anonymous, "get", "post", Route = null)]HttpRequestMessage req,
   [DocumentDB("MyDb", "MyCollection", ConnectionStringSetting = "MyCosmosConnectionString")] out dynamic document,
   TraceWriter log)
{
    log.Info("C# HTTP trigger function processed a request.");

    dynamic data = req.Content.ReadAsAsync<object>().GetAwaiter().GetResult();
    document = data;

    return req.CreateResponse(HttpStatusCode.OK);
}

Если я отправляю полезную нагрузку JSON конечной точке Http, выходная привязка работает, как и ожидалось:

Sending payload with Postman

При проверке Обозревателя данных я вижу:

Document in the Data Explorer

Если я отправлю второй полезный груз, на этот раз добавим свойство (с тем же идентификатором):

Sending updated payload through Postman

Обозреватель данных показывает, что документ был обновлен, с тем же кодом функции:

Document updated in Data Explorer

Можете ли вы добавить полное исключение / ошибка трассировки ?Ваше сообщение служебной шины включает в себя «id»?Ваша коллекция разделена?

Если ваша коллекция секционирована и вы изменяете значение свойства ключа раздела, то привязка не обновит существующий документ, она создаст новый, потому что операция Upsert не найдет существующийдокумент (на основе идентификатора / ключа раздела).Но это не приведет к исключению.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...