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 i updateDescription nie są jeszcze obsługiwane w dokumencie wyjściowym.
  • insertTypy operacji , updatei replace 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łędu operationType InvalidateNamespaceNotFound zwracany jest błąd.

Następne kroki