es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Azure Cosmos DB: Violación de restricción de índice único al utilizar UpsertDocumentAsync.

He definido una política UniqueKey en mi contenedor Azure Cosmos DB, para el campo UniqueName.

La siguiente función se llama en un temporizador.

Estoy intentando Upsert documentos en Azure Cosmos DB usando las vinculaciones de Azure Functions, como así:

“`public async Task ManageItems([ActivityTrigger] string records,
[CosmosDB(
databaseName: "mydatabase",
collectionName: "items",
ConnectionStringSetting = "CosmosDbConnectionString")] DocumentClient client,
ILogger log)
{
var collectionUri = UriFactory.CreateDocumentCollectionUri("mydatabase", "items");

foreach (var record in records)
{
log.LogDebug($"Upserting itemNumber={record.UniqueName}");
await client.UpsertDocumentAsync(collectionUri, record);
}
}
“`

Durante la primera ejecución en un contenedor “items” en blanco, el Upsert para cada registro funciona espléndidamente, insertando cada registro como un documento específico.

Sin embargo, al hacer una prueba de los mismos datos que en la primera ejecución, pero ahora esperando un “Update” en lugar de un intento de “Insert”, obtengo una excepción:

Violación de la restricción del índice único después de que se ejecute el método UpsertDocumentAsync.

¿Qué me falta aquí?

Según mi entendimiento, un Upsert es una actualización o una inserción, dependiendo de si el objeto existe o no, a través de su identificador único.

La comprobación de si el identificador único del objeto saliente del método coincide con el identificador único del documento existente debería estar sucediendo a nivel de contenedor de Cosmos DB.

Lo que espero que suceda es que la llamada se dé cuenta de que el documento con ese ID único ya existe, y que se realice una actualización, no que lance una excepción. Esperaría que lanzara una excepción si el método fuera solo para insertar.

Tags:  , , ,

Answer

  1. Avatar for davy.ai

    Parece que la política de UniqueKey definida en el Contenedor de Azure Cosmos DB para el campo UniqueName no se está aplicando correctamente. Esto puede suceder si el campo UniqueName no se especifica correctamente en el documento que se está actualizando, o si hay un problema con la política en sí misma.

    Una cosa a comprobar es si el parámetro records que se pasa a la función ManageItems es una cadena que contiene múltiples documentos, cada uno con su propio campo UniqueName. Si este es el caso, es posible que el bucle esté iterando incorrectamente sobre cada carácter en la cadena en lugar de cada documento.

    Otra cosa a considerar es si la inserción inicial de los documentos se realizó correctamente y si la política de UniqueKey se aplicó correctamente a esos documentos. Es posible que la política no se haya aplicado correctamente, lo que lleva a la inserción de documentos duplicados.

    Si ninguno de estos problemas potenciales parece ser la causa del problema, puede valer la pena revisar la política de UniqueKey en sí para asegurarse de que esté configurada correctamente para el campo UniqueName. Esto podría implicar revisar la configuración de la política en el portal de Azure o utilizar el SDK de Cosmos DB para inspeccionar la política programáticamente.

Comments are closed.