Stromen wijzigen in de API van Azure Cosmos DB voor MongoDB

VAN TOEPASSING OP: MongoDB

Ondersteuning voor wijzigingenfeeds in de API van Azure Cosmos DB voor MongoDB is beschikbaar met behulp van de API voor wijzigingsstromen. Met behulp van de API voor wijzigingsstromen kunnen uw toepassingen de wijzigingen in de verzameling of in 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 hun wijzigingstijd en de sorteervolgorde wordt gegarandeerd per shardsleutel.

Notitie

Als u wijzigingsstromen wilt gebruiken, maakt u de API van Azure Cosmos DB voor mongoDB-account met serverversie 3.6 of hoger. Als u de voorbeelden van de wijzigingsstroom uitvoert voor een eerdere versie, 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 fullDocument optie zijn vereist om de wijzigingsstromen op te halen. Het controleren op verwijderingsbewerkingen met behulp van wijzigingsstromen 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 true en een TTL instellen voor het item. Aangezien het bijwerken van 'verwijderd' naar true een update is, is deze 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 binnen één shard

In het volgende voorbeeld ziet u hoe u wijzigingen in de items binnen één shard kunt ophalen. In dit voorbeeld worden de wijzigingen opgehaald van items met een shard-sleutel die gelijk is aan 'a' en de waarde van de shard-sleutel gelijk aan '1'. Het is mogelijk om verschillende clients gelijktijdig wijzigingen van verschillende shards 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 verdelen. Gebruik de aangepaste opdracht GetChangeStreamTokens om de belasting te verdelen over fysieke shards/partities.

Huidige beperkingen

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

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

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

In tegenstelling tot de wijzigingenfeed in de API voor NoSQL van Azure Cosmos DB, is er geen afzonderlijke processorbibliotheek voor wijzigingenfeeds voor het verbruik van wijzigingsstromen of een behoefte aan een leasecontainer. Er is momenteel geen ondersteuning voor Azure Functions triggers 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 geretourneerd.

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

Volgende stappen