Stromen wijzigen in Azure Cosmos DB API voor MongoDB

VAN TOEPASSING OP: Azure Cosmos DB-API voor MongoDB

Ondersteuning voor wijzigingsfeeds in Azure Cosmos DB API voor MongoDB is beschikbaar met behulp van de API voor wijzigingsstromen. Met behulp van de API voor wijzigingsstreams kunnen uw toepassingen de wijzigingen in de verzameling of de items in één shard ophalen. Later kunt u verdere acties uitvoeren op basis van de resultaten. Wijzigingen in de items in de verzameling worden vastgelegd in de volgorde van de wijzigingstijd en de sorteer volgorde wordt gegarandeerd per shardsleutel.

Notitie

Als u wijzigingsstreams wilt gebruiken, maakt Azure Cosmos DB API voor MongoDB-account met serverversie 3.6 of hoger. Als u de voorbeelden van de wijzigingsstroom op een eerdere versie hebt uitgevoerd, ziet u mogelijk de naam van de niet-herkende pijplijnfase: $changeStream fout.

Voorbeelden

In het volgende voorbeeld ziet u hoe u wijzigingsstromen kunt ophalen voor alle items in de verzameling. In dit voorbeeld wordt een cursor gemaakt om items te bekijken wanneer ze worden ingevoegd, bijgewerkt of vervangen. De $match fase, $project fase en optie zijn vereist om de fullDocument wijzigingsstromen op te halen. Het zoeken naar verwijderbewerkingen met behulp van wijzigingsstreams wordt momenteel niet ondersteund. Als tijdelijke oplossing kunt u een zachte markering toevoegen aan de items die worden verwijderd. U kunt bijvoorbeeld een kenmerk toevoegen aan het item met de naam 'verwijderd'. Wanneer u het item wilt verwijderen, kunt u 'verwijderd' instellen op en een true TTL instellen voor het item. Omdat het bijwerken van 'verwijderd' naar een update is, is deze true wijziging zichtbaar in de wijzigingsstroom.

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

Wijzigingen in één shard

In het volgende voorbeeld ziet u hoe u wijzigingen kunt aanbrengen in de items in één shard. In dit voorbeeld worden de wijzigingen van items met een shardsleutel die gelijk is aan 'a' en de shardsleutelwaarde gelijk aan '1'. Het is mogelijk om verschillende clients wijzigingen van verschillende shards parallel te laten lezen.

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

Wijzigingsstromen schalen

Wanneer u wijzigingsstromen op schaal gebruikt, kunt u de belasting het beste gelijkmatig spreiden. Gebruik de aangepaste getChangeStreamTokens-opdracht om de belasting over fysieke shards/partities te verdelen.

Huidige beperkingen

De volgende beperkingen zijn van toepassing bij het gebruik van wijzigingsstromen:

  • De operationType eigenschappen en worden nog niet ondersteund in het updateDescription uitvoerdocument.
  • De insert update bewerkingentypen , en replace worden momenteel ondersteund. De verwijderbewerking of andere gebeurtenissen worden echter nog niet ondersteund.

Vanwege deze beperkingen zijn de $match, $project fase en volledigedocumentopties vereist, zoals wordt weergegeven in de vorige voorbeelden.

In tegenstelling tot de wijzigingsfeed in de SQL-API van Azure Cosmos DB is er geen afzonderlijke processorbibliotheek voor de wijzigingsfeed om wijzigingsstromen te gebruiken of is er geen leasecontainer nodig. Er is momenteel geen ondersteuning voor Azure Functions voor het verwerken van wijzigingsstromen.

Foutafhandeling

De volgende foutcodes en berichten worden ondersteund bij het gebruik van wijzigingsstromen:

  • HTTP-foutcode 16500: wanneer de wijzigingsstroom wordt beperkt, wordt een lege pagina weergegeven.

  • NamespaceNotFound (OperationType Invalidate) : als u een wijzigingsstroom op de verzameling die niet bestaat of als de verzameling is uitgevallen, wordt een NamespaceNotFound fout geretourneerd. Omdat de operationType eigenschap niet kan worden geretourneerd in het uitvoerdocument, wordt de fout geretourneerd in plaats van de operationType Invalidate NamespaceNotFound fout.

Volgende stappen