Zmienianie strumieni w interfejsie API usługi Azure Cosmos DB dla bazy danych MongoDB
DOTYCZY: Mongodb
Obsługa zestawienia zmian w interfejsie API usługi Azure Cosmos DB dla bazy danych MongoDB jest dostępna przy użyciu interfejsu API strumieni zmian. Za pomocą interfejsu API zmian strumieni aplikacje mogą pobierać zmiany wprowadzone w kolekcji lub do elementów w jednym fragmentie. Później możesz podjąć dalsze działania na podstawie wyników. Zmiany elementów w kolekcji są przechwytywane w kolejności ich czasu modyfikacji, a kolejność sortowania jest gwarantowana dla klucza fragmentu.
Uwaga
Aby użyć strumieni zmian, utwórz konto interfejsu API usługi Azure Cosmos DB dla bazy danych MongoDB z serwerem w wersji 3.6 lub nowszej. Jeśli uruchomisz przykłady strumienia zmian dla starszej wersji, może zostać wyświetlona nierozpoznana nazwa etapu potoku: $changeStream błąd.
Przykłady
W poniższym przykładzie pokazano, jak pobrać strumienie zmian dla wszystkich elementów w kolekcji. W tym przykładzie tworzony jest kursor do obserwowania elementów podczas wstawiania, aktualizowania lub zastępowania. Etap $match
, $project
etap i fullDocument
opcja są wymagane do pobrania strumieni zmian. Obserwowanie operacji usuwania przy użyciu strumieni zmian nie jest obecnie obsługiwane. Aby obejść ten problem, można dodać znacznik nietrwały do elementów, które są usuwane. Można na przykład dodać atrybut w elemencie o nazwie "deleted". Jeśli chcesz usunąć element, możesz ustawić wartość "usunięto" na i ustawić true
czas wygaśnięcia dla elementu. Ponieważ aktualizacja elementu "deleted" w celu true
jest aktualizacją, ta zmiana będzie widoczna w strumieniu zmian.
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());
}
}
Zmiany w ramach pojedynczego fragmentu
W poniższym przykładzie pokazano, jak uzyskać zmiany elementów w ramach pojedynczego fragmentu. Ten przykład pobiera zmiany elementów, które mają klucz fragmentu równy "a", a wartość klucza fragmentu równa "1". Istnieje możliwość równoległego odczytywania zmian przez różnych klientów z różnych fragmentów.
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" });
Skalowanie strumieni zmian
W przypadku korzystania ze strumieni zmian na dużą skalę najlepiej równomiernie rozłożyć obciążenie. Użyj polecenia niestandardowego GetChangeStreamTokens , aby rozłożyć obciążenie między fizyczne fragmenty/partycje.
Bieżące ograniczenia
Podczas korzystania ze strumieni zmian obowiązują następujące ograniczenia:
- Właściwości
operationType
iupdateDescription
nie są jeszcze obsługiwane w dokumencie wyjściowym. insert
Typy operacji ,update
ireplace
są obecnie obsługiwane. Jednak operacja usuwania lub inne zdarzenia nie są jeszcze obsługiwane.
Ze względu na te ograniczenia wymagany jest etap $match, etap $project i opcje fullDocument, jak pokazano w poprzednich przykładach.
W przeciwieństwie do zestawienia zmian w interfejsie API usługi Azure Cosmos DB dla NoSQL nie ma oddzielnej biblioteki procesora zestawienia zmian do korzystania ze strumieni zmian lub potrzeby kontenera dzierżaw. Obecnie nie ma obsługi wyzwalaczy Azure Functions przetwarzania strumieni zmian.
Obsługa błędów
Podczas korzystania ze strumieni zmian obsługiwane są następujące kody błędów i komunikaty:
Kod błędu HTTP 16500 — gdy strumień zmian jest ograniczany, zwraca pustą stronę.
NamespaceNotFound (OperationType Invalidate) — jeśli uruchomisz strumień zmiany w kolekcji, która nie istnieje lub jeśli kolekcja zostanie porzucona,
NamespaceNotFound
zostanie zwrócony błąd.operationType
Ponieważ nie można zwrócić właściwości w dokumencie wyjściowym, zamiast błęduoperationType Invalidate
NamespaceNotFound
zwracany jest błąd.