Partager via


Mise à jour partielle de document dans Azure Cosmos DB

S’APPLIQUE À : NoSQL

La fonctionnalité Mise à jour partielle de document Azure Cosmos DB (également appelée API Patch) offre un moyen pratique de modifier un document dans un conteneur. Actuellement, pour mettre à jour un document dont le client a besoin pour le lire, il faut exécuter des vérifications de contrôle d’accès concurrentiel optimiste (si nécessaire), mettre à jour le document localement, puis l’envoyer en tant qu’appel d’API de remplacement de document entier.

La fonctionnalité de mise à jour partielle de document améliore cette expérience de manière significative. Le client peut juste envoyer les propriétés/champs modifiés dans un document sans effectuer une opération de remplacement de document entier. Les principaux avantages de cette fonctionnalité sont les suivants :

  • Amélioration de la productivité des développeurs : fournit une API pratique pour faciliter l’utilisation et pouvoir mettre à jour le document de manière conditionnelle.
  • Améliorations des performances : évite des cycles de processeur supplémentaires côté client et réduit la latence et la bande passante réseau de bout en bout.
  • Écritures multirégions : prend en charge la résolution automatique et transparente des conflits avec des mises à jour partielles sur des chemins discrets dans le même document.

Notes

L’opération de mise à jour partielle du document est basée sur la RFC de correctif JSON. Les noms de propriétés dans les chemins d’accès doivent échapper aux caractères ~ et / en tant que ~0 et ~1, respectivement.

Exemple de document JSON cible :

{
  "id": "e379aea5-63f5-4623-9a9b-4cd9b33b91d5",
  "name": "R-410 Road Bicycle",
  "price": 455.95,
  "inventory": {
    "quantity": 15
  },
  "used": false,
  "categoryId": "road-bikes",
  "tags": ["r-series"]
}

Document de correctif JSON :

[
  { "op": "add", "path": "/color", "value": "silver" },
  { "op": "remove", "path": "/used" },
  { "op": "set", "path": "/price", "value": 355.45 }
  { "op": "incr", "path": "/inventory/quantity", "value": 10 },
  { "op": "add", "path": "/tags/-", "value": "featured-bikes" },
  { "op": "move", "from": "/color", "path": "/inventory/color" }
]

Document JSON obtenu :

{
  "id": "e379aea5-63f5-4623-9a9b-4cd9b33b91d5",
  "name": "R-410 Road Bicycle",
  "price": 355.45,
  "inventory": {
    "quantity": 25,
    "color": "silver"
  },
  "categoryId": "road-bikes",
  "tags": ["r-series", "featured-bikes"]
}

Opérations prises en charge

Ce tableau récapitule les opérations prises en charge par cette fonctionnalité.

Notes

Le chemin cible fait référence à un emplacement dans le document JSON.

Type d'opération Description
Ajouter Add effectue l’une des actions suivantes, en fonction du chemin cible :
• Si le chemin cible spécifie un élément qui n’existe pas, celui-ci est ajouté.
• Si le chemin cible spécifie un élément qui existe déjà, sa valeur est remplacée.
• Si le chemin cible est un index de tableau valide, un nouvel élément est inséré dans le tableau à l’index spécifié. Cela déplace les éléments existants après le nouvel élément.
• Si l’index spécifié est égal à la longueur du tableau, il ajoute un élément au tableau. Au lieu de spécifier un index, vous pouvez également utiliser le caractère -. Cela entraîne également l’ajout de l’élément au tableau.
Remarque : Si vous spécifiez un index plus grand que la longueur du tableau, une erreur se produit.
Définir Set l’opération est similaire à sauf Add avec le type de données Array. Si le chemin cible est un index de tableau valide, l'élément existant à cet index est mis à jour.
Replace L’opération Replace est similaire à Set, sauf qu’elle suit une sémantique de remplacement seul stricte. Si le chemin cible spécifie un élément ou un tableau qui n’existe pas, une erreur se produit.
Remove Remove effectue l’une des actions suivantes, en fonction du chemin cible :
• Si le chemin cible spécifie un élément qui n’existe pas, une erreur se produit.
• Si le chemin cible spécifie un élément qui existe déjà, celui-ci est supprimé.
• Si le chemin cible est un index de tableau, celui-ci est supprimé et tous les éléments situés au-dessus de l’index spécifié sont décalés d’une position vers l’arrière.
Remarque : Si vous spécifiez un index supérieur ou égal à la longueur du tableau, une erreur se produit.
Incrément Cet opérateur incrémente un champ de la valeur spécifiée. Il peut accepter des valeurs à la fois positives et négatives. Si le champ n’existe pas, il crée le champ et lui affecte la valeur spécifiée.
Déplacer Cet opérateur supprime la valeur dans un emplacement spécifié et l’ajoute dans l’emplacement cible. L’objet d’opération DOIT contenir un membre « from », qui est une chaîne contenant une valeur de pointeur JSON qui fait référence à l’emplacement dans le document cible à partir duquel déplacer la valeur. L’emplacement « from » doit exister pour que l’opération réussisse. Si l’emplacement « path » suggère un objet qui n’existe pas, il crée l’objet et définit la valeur égale à la valeur dans l’emplacement « from »
•Si l’emplacement « path » suggère un objet qui existe déjà, il remplace la valeur dans l’emplacement « path » par la valeur dans l’emplacement « from »
•L’attribut « path » ne peut pas être un enfant JSON de l’emplacement JSON « from »

Modes pris en charge

La fonctionnalité de mise à jour partielle de document prend en charge les modes de fonctionnement suivants. Consultez le document Bien démarrer pour obtenir des exemples de code.

  • Patch monodocument : Vous pouvez appliquer un patch à un seul document en fonction de son identifiant et de la clé de partition. Il est possible d’exécuter plusieurs opérations de patch sur un seul document. La limite maximale est de 10 opérations.

  • Patch multi-document : Vous pouvez appliquer un patch à plusieurs documents dans la même clé de partition dans le cadre d’une transaction. Cette transaction multi-documents est validée seulement si toutes les opérations réussissent dans l’ordre dans lequel elles sont décrites. Si une opération échoue, la totalité de la transaction est restaurée.

  • Mise à jour conditionnelle : pour les modes susmentionnés, il est également possible d’ajouter un prédicat de filtre de type SQL (par exemple, from c where c.taskNum = 3) de sorte que l’opération échoue si la précondition spécifiée dans le prédicat n’est pas remplie.

  • Vous pouvez également utiliser les API en bloc des kits SDK pris en charge pour exécuter une ou plusieurs opérations de patch sur plusieurs documents.

Similitudes et différences

Comparons les similitudes et les différences entre les modes pris en charge.

Add vs. Set

L’opération Set est similaire à l’opération Add pour tous les types de données, sauf Array. Une opération Add à un index (valide) entraîne l’ajout d’un élément à l’index spécifié et tous les éléments existants dans le tableau sont décalés après l’élément existant. Ce comportement diffère de l’opération Set qui met à jour l’élément existant à l’index spécifié.

Add ou Replace

L’opération Add ajoute une propriété si celle-ci n’existe pas déjà (y compris le type de données Array). L’opération Replace échoue si la propriété n’existe pas (s’applique également au type de données Array).

Set vs. Replace

L’opération Set ajoute une propriété si celle-ci n’existe pas déjà (sauf s’il y avait un Array). L’opération Replace échoue si la propriété n’existe pas (s’applique également au type de données Array).

Notes

Replace est un bon candidat lorsque l’utilisateur s’attend à ce qu’une partie des propriétés soit toujours présente, et vous permet de le déclarer/l’appliquer.

Référence de l’API REST pour la mise à jour partielle d’un document

L’API REST d’Azure Cosmos DB fournit un accès programmatique aux ressources d’Azure Cosmos DB pour créer, interroger et supprimer des bases de données, des collections de documents et des documents. Outre l’exécution d’opérations d’insertion, de remplacement, de suppression, de lecture, d’énumération et d’interrogation sur les documents JSON d’une collection, vous pouvez utiliser la méthode HTTP PATCH pour l’opération de mise à jour partielle d’un document. Pour plus d’informations, consultez les informations de référence relatives à l’API REST d’Azure Cosmos DB.

Par exemple, voici à quoi ressemble la requête pour une opération set à l’aide de la mise à jour partielle d’un document.

PATCH https://querydemo.documents.azure.com/dbs/FamilyDatabase/colls/FamilyContainer/docs/Andersen.1 HTTP/1.1
x-ms-documentdb-partitionkey: ["Andersen"]
x-ms-date: Tue, 29 Mar 2016 02:28:29 GMT
Authorization: type%3dmaster%26ver%3d1.0%26sig%3d92WMAkQv0Zu35zpKZD%2bcGSH%2b2SXd8HGxHIvJgxhO6%2fs%3d
Content-Type:application/json_patch+json
Cache-Control: no-cache
User-Agent: Microsoft.Azure.DocumentDB/2.16.12
x-ms-version: 2015-12-16
Accept: application/json
Host: querydemo.documents.azure.com
Cookie: x-ms-session-token#0=602; x-ms-session-token=602
Content-Length: calculated when request is sent
Connection: keep-alive
{
  "operations": [
    {
      "op": "set",
      "path": "/Parents/0/FamilyName",
      "value": "Bob"
    }
  ]
}

Résolution des conflits au niveau du document vs. au niveau du chemin

Si votre compte Azure Cosmos DB est configuré avec plusieurs régions d’écriture, des conflits et des stratégies de résolution des conflits sont applicables au niveau du document, LWW (Last Write Wins) étant la stratégie de résolution des conflits par défaut. Pour les mises à jour partielles de document, les opérations de patch sur plusieurs régions détectent et résolvent les conflits à un niveau de chemin plus précis.

Un exemple permet de mieux comprendre la résolution de conflits.

Supposons que vous ayez le document suivant dans Azure Cosmos DB :

{
  "id": 1,
  "name": "John Doe",
  "email": "jdoe@contoso.com",
  "phone": ["12345", "67890"],
  "level": "gold"
}

Différents clients émettent des opérations de correctif simultanément dans différentes régions :

  • Set attribue /level sur platinum
  • Remove 67890 de /phone

Image montrant une résolution de conflits dans des opérations simultanées de mise à jour partielle multirégions.

Étant donné que les requêtes de patch ont été faites sur des chemins non conflictuels dans le document, les conflits de ces requêtes sont résolus de manière automatique et transparente, contrairement à la stratégie Last Writer Wins (LWW) au niveau du document.

Le client verra le document suivant après la résolution des conflits :

{
  "id": 1,
  "name": "John Doe",
  "email": "jdoe@contoso.com",
  "phone": ["12345"],
  "level": "platinum"
}

Notes

Si la même propriété d’un document est corrigée simultanément dans plusieurs régions, les stratégies de résolution de conflits standard s’appliquent.

Modifier le flux

Le flux de modification dans Azure Cosmos DB écoute un conteneur pour toutes les modifications, puis génère les documents qui ont été modifiés. À l’aide du flux de modification, vous voyez toutes les mises à jour des documents, y compris les mises à jour partielles et complètes des documents. Lorsque vous traitez des éléments à partir du flux de modification, le document complet est retourné même si la mise à jour résulte d’une opération de correctif.

Pour plus d’informations sur le flux de modification dans Azure Cosmos DB, consultez Flux de modification dans Azure Cosmos DB.

Étapes suivantes

  • Découvrir comment démarrer avec la Mise à jour partielle de document en utilisant .NET, Java et Node
  • Questions fréquentes sur la Mise à jour partielle de document