Flux de modification dans l’API pour MongoDB d’Azure Cosmos DB
S’APPLIQUE À : MongoDB
La prise en charge du flux de modification dans l’API pour MongoDB d’Azure Cosmos DB est disponible à l’aide de l’API de flux de modification. À l’aide de l’API de flux de modification, vos applications peuvent obtenir les modifications apportées à la collection ou aux éléments d’une seul partition. Par la suite, vous pouvez effectuer d’autres actions en fonction des résultats. Les modifications apportées aux éléments de la collection sont capturées dans l’ordre de leur modification, et l’ordre de tri est garanti par clé de partition.
Notes
Pour utiliser les flux de modifications, créez l’API d’Azure Cosmos DB pour le compte MongoDB avec la version 3.6 ou ultérieure du serveur. Si vous exécutez les exemples de flux de modifications sur une version antérieure, vous pouvez voir l’erreur Nom de phase de pipeline non reconnu : $changeStream.
Exemples
L’exemple suivant montre comment récupérer des flux de modification sur tous les éléments de la collection. Cet exemple crée un curseur pour surveiller les éléments lorsqu’ils sont insérés, mis à jour ou remplacés. L’étape $match
, l’étape $project
et l’option fullDocument
sont nécessaires pour récupérer les flux de modification. La surveillance des opérations de suppression à l’aide de flux de modification n’est pas prise en charge actuellement. Pour contourner ce problème, vous pouvez ajouter un marqueur réversible sur les éléments en cours de suppression. Par exemple, vous pouvez ajouter un attribut à l’élément appelé « supprimé ». Lorsque vous voulez supprimer l’élément, vous pouvez définir « supprimé » sur true
et définir une TTL sur l’élément. Étant donné que la mise à jour de « supprimé » sur true
reste une mise à jour, cette modification sera visible dans le flux de modification.
var cursor = db.coll.watch(
[
{ $match: { "operationType": { $in: ["insert", "update", "replace"] } } },
{ $project: { "_id": 1, "fullDocument": 1, "ns": 1, "documentKey": 1 } }
],
{ fullDocument: "updateLookup" });
while (!cursor.isExhausted()) {
if (cursor.hasNext()) {
printjson(cursor.next());
}
}
Modifications au sein d’une partition unique
L’exemple suivant montre comment récupérer les modifications apportées aux éléments au sein d’une partition unique. Cet exemple récupère les modifications des éléments dont la clé de partition est égale à « a » et la valeur de clé de partition égale à « 1 ». Il est possible que différents clients lisent en parallèle les modifications de différentes partitions.
var cursor = db.coll.watch(
[
{
$match: {
$and: [
{ "fullDocument.a": 1 },
{ "operationType": { $in: ["insert", "update", "replace"] } }
]
}
},
{ $project: { "_id": 1, "fullDocument": 1, "ns": 1, "documentKey": 1} }
],
{ fullDocument: "updateLookup" });
Mise à l’échelle des flux de modification
Lorsque vous utilisez des flux de modification à grande échelle, il est préférable de répartir uniformément la charge. Utilisez la commande personnalisée GetChangeStreamTokens pour répartir la charge sur les partitions/étendues physiques.
Limites actuelles
Les limitations suivantes s’appliquent quand plusieurs flux de modification sont utilisés :
- Les propriétés
operationType
etupdateDescription
ne sont pas encore prises en charge dans le document de sortie. - Les types d'opérations
insert
,update
etreplace
sont actuellement pris en charge. Toutefois, l’opération de suppression ou d’autres événements ne sont pas encore pris en charge.
En raison de ces limitations, l’étape $match, l’étape $project et les options fullDocument sont requises, comme indiqué dans les exemples précédents.
Contrairement au flux de modification dans l’API pour NoSQL d’Azure Cosmos DB, il n’existe pas de bibliothèque de processeurs de flux de modification distincte pour consommer des flux de modification ou un conteneur de baux. Il n’existe actuellement aucune prise en charge pour les déclencheurs Azure Functions permettant de traiter les flux de modification.
Gestion des erreurs
Les codes d’erreur et messages suivants sont pris en charge lorsque des flux de modification sont utilisés :
Code d’erreur HTTP 16500 : lorsque le flux de modification est limité, il retourne une page vide.
NamespaceNotFound (OperationType Invalidate) : si vous exécutez le flux de modification sur une collection qui n’existe pas ou si la collection est supprimée, une erreur
NamespaceNotFound
est retournée. Étant donné que la propriétéoperationType
ne peut pas être retournée dans le document de sortie, au lieu de l’erreuroperationType Invalidate
, l’erreurNamespaceNotFound
est retournée.