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 enupdateDescription
worden nog niet ondersteund in het uitvoerdocument. - De
insert
bewerkingstypen ,update
enreplace
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 deoperationType
eigenschap niet kan worden geretourneerd in het uitvoerdocument, wordt de fout geretourneerd in plaats van deoperationType Invalidate
NamespaceNotFound
fout.