Delen via


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 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 sorteervolgorde wordt gegarandeerd per shardsleutel.

Notitie

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

Voorbeelden

In het volgende voorbeeld ziet u hoe u wijzigingenstromen 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 in het item met de naam 'verwijderd'. Wanneer u het item wilt verwijderen, kunt u 'verwijderd' true instellen op en een TTL instellen voor het item. Omdat 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 kunt aanbrengen in de items binnen één shard. In dit voorbeeld worden de wijzigingen opgehaald van items met een shardsleutel die gelijk is aan 'a' en de shardsleutelwaarde gelijk aan '1'. Het is mogelijk dat verschillende clients wijzigingen van verschillende shards parallel 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 over fysieke shards/partities te verdelen.

Huidige beperkingen

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

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

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

In tegenstelling tot de wijzigingenfeed in de API van Azure Cosmos DB voor NoSQL, is er geen afzonderlijke bibliotheek met wijzigingenfeedprocessors voor het verbruik van wijzigingsstromen of een behoefte aan een leasecontainer. Er is momenteel geen ondersteuning voor Azure Functions-triggers om wijzigingsstromen te verwerken.

Foutafhandeling

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

  • HTTP-foutcode 16500 : wanneer de wijzigingsstroom wordt beperkt, wordt er 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, in plaats van de operationType Invalidate fout, wordt de NamespaceNotFound fout geretourneerd.

Volgende stappen