Udostępnij za pośrednictwem


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. Korzystając z interfejsu API zmian strumieni, aplikacje mogą pobierać zmiany wprowadzone w kolekcji lub do elementów w jednym fragmentze. 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 na klucz fragmentu.

Uwaga

Aby użyć strumieni zmian, utwórz interfejs 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 we wszystkich elementach w kolekcji. W tym przykładzie tworzony jest kursor do obserwowania elementów podczas wstawiania, aktualizowania lub zastępowania. Aby $match pobrać strumienie zmian, wymagany jest etap, $project etap i fullDocument opcja. 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żesz 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 "usunięta" do 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 w elementach w ramach pojedynczego fragmentu. Ten przykład pobiera zmiany elementów, które mają klucz fragmentu równy "a" i wartość klucza fragmentu równe "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 używania 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.
  • Typy insertoperacji , updatei są replace obecnie obsługiwane. Jednak operacja usuwania lub inne zdarzenia nie są jeszcze obsługiwane.

Ze względu na te ograniczenia, etap $match, etap $project i opcje fullDocument są wymagane, 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 ani potrzeby kontenera dzierżaw. Obecnie wyzwalacze usługi Azure Functions nie obsługują 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ń zmiany 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 Invalidate zwracany NamespaceNotFound jest błąd.

Następne kroki