Ändra strömmar i Azure Cosmos DB:s API för MongoDB

GÄLLER FÖR: Mongodb

Stöd för ändringsflöde i Azure Cosmos DB:s API för MongoDB är tillgängligt med hjälp av API:et för ändringsströmmar. Genom att använda API:et för ändringsströmmar kan dina program hämta ändringarna i samlingen eller objekten i en enda shard. Senare kan du vidta ytterligare åtgärder baserat på resultaten. Ändringar av objekten i samlingen samlas in i ordning efter ändringstiden och sorteringsordningen garanteras per shardnyckel.

Anteckning

Om du vill använda ändringsströmmar skapar du Azure Cosmos DB:s API för MongoDB-konto med serverversion 3.6 eller senare. Om du kör ändringsströmsexemplen mot en tidigare version kan det hända att namnet på pipelinesteget Okänd visas: $changeStream fel.

Exempel

I följande exempel visas hur du hämtar ändringsströmmar för alla objekt i samlingen. Det här exemplet skapar en markör för att titta på objekt när de infogas, uppdateras eller ersätts. $match Fasen, $project fasen och fullDocument alternativet krävs för att hämta ändringsströmmarna. Det finns för närvarande inte stöd för att titta efter borttagningsåtgärder med hjälp av ändringsströmmar. Som en lösning kan du lägga till en mjuk markör för de objekt som tas bort. Du kan till exempel lägga till ett attribut i objektet "borttaget". När du vill ta bort objektet kan du ange "borttaget" till true och ange en TTL för objektet. Eftersom uppdateringen "borttagen" till true är en uppdatering visas den här ändringen i ändringsströmmen.

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());
    }
}

Ändringar i en enda shard

I följande exempel visas hur du hämtar ändringar i objekten i en enda shard. Det här exemplet hämtar ändringarna av objekt som har en shardnyckel som är lika med "a" och shardnyckelvärdet lika med "1". Det går att låta olika klienter läsa ändringar från olika shards parallellt.

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" });

Skala ändringsströmmar

När du använder ändringsströmmar i stor skala är det bäst att fördela belastningen jämnt. Använd det anpassade kommandot GetChangeStreamTokens för att sprida belastningen över fysiska shards/partitioner.

Aktuella begränsningar

Följande begränsningar gäller när du använder ändringsströmmar:

  • Egenskaperna operationType och updateDescription stöds ännu inte i utdatadokumentet.
  • Åtgärdstyperna insert, updateoch replace stöds för närvarande. Borttagningsåtgärden eller andra händelser stöds dock inte ännu.

På grund av dessa begränsningar krävs $match fas, $project fas och fullständigdokumentering, som du ser i föregående exempel.

Till skillnad från ändringsflödet i Azure Cosmos DB:s API för NoSQL finns det inte ett separat bibliotek för ändringsflödesprocessor för att använda ändringsströmmar eller ett behov av en lånecontainer. Det finns för närvarande inte stöd för Azure Functions utlösare för att bearbeta ändringsströmmar.

Felhantering

Följande felkoder och meddelanden stöds när du använder ändringsströmmar:

  • HTTP-felkod 16500 – När ändringsströmmen begränsas returneras en tom sida.

  • NamespaceNotFound (OperationType Invalidate) – Om du kör ändringsströmmen på samlingen som inte finns eller om samlingen tas bort returneras ett NamespaceNotFound fel. Eftersom egenskapen operationType inte kan returneras i utdatadokumentet returneras felet i stället för operationType Invalidate felet NamespaceNotFound .

Nästa steg