2013-02-13 10 views
5

Odpowiedź z CouchDB na żądanie _zmian wraca w tym formacie: {"seq": 12, "id": "foo", "changes": [{"rev": "1-23202479633c2b380f79507a776743d5"}]}W odpowiedzi CouchDB _changes, dlaczego są tablice elementów "zmiany"?

Moje pytanie - dlaczego element "changes" jest tablicą? Który scenariusz zwróci więcej niż jeden element w elemencie zmiany? Nigdy nie widziałem przykładu online z więcej niż jednym przedmiotem, a z własnego doświadczenia widziałem tylko jeden przedmiot.

Piszę kod, który wchodzi w interakcję ze zmianami i chciałbym zrozumieć, co zrobić, jeśli w rzeczywistości było więcej niż jeden przedmiot.

Dzięki Mike

Odpowiedz

8

Elementem zmiany jest tablicą, aby odzwierciedlić wszystkie istniał liście do rewizji dokumentu. Jak wiesz, CouchDB nie usuwa całkowicie dokumentu, ale ustawia nagrobek, aby zapobiec jego przypadkowemu wskrzeszeniu po replikacji ze źródła, które ma starszą wersję, która nie została jeszcze usunięta. Możliwe jest również wiele listków z powodu konfliktów aktualizacji, które wystąpiły po replikacji. Na przykład:

  1. Mike stworzyli dokument w bazie danych A i replikowane go do bazy B:

    { "Wyniki": [ { "nast": 1, "id": "rzeczą", "zmiany": [{ "REV": "1-967a00dff5e02add41819138abb3284d"}]} ] "last_seq": 1}

  2. John otrzymaniu dokumentu i aktualizowane go w bazie danych B:

    { "wyniki": [ { "SEQ" 2 "id" "co", "zmiany" [{ "rev": "2-7051cbe5c8faecd085a3fa619e6e6337"}]} ] "last_seq": 2}

  3. Ale ten sam Mike dokonał również kilku zmian (zapomniałem wyczyścić dane lub dodać coś ważnego) dla niego w bazie danych A:

    {"wyniki": [ {"seq": 2, "id": "thing" , "zmiany": [{ "rev": "2-13839535feb250d3d8290998b8af17c3"}]} ] "last_seq": 2}

  4. I replikowane go ponownie do bazy B.John otrzymuje dokument w stanie konfliktu i patrząc na zmiany paszy z parametrem zapytania style=all_docs zobaczyć następny wynik:

    { „wyników”: [ { „nast”: 3 „id”: „rzecz”, „zmiany”: [{ "rev": "2-7051cbe5c8faecd085a3fa619e6e6337"}, { "rev": "2-13839535feb250d3d8290998b8af17c3"}]} ] "last_seq": 3}

    Choć bezpośredni dostęp do dokumentu zwraca swoje dane z wining rewizja (z wyższym numerem kolejnym lub po prostu najnowszym), możliwe jest, że ma wiele sprzecznych wersji (wyobraź sobie równoczesne zapisy do pojedynczego dokumentu w kilkunastu bazach danych, które są replikowane między sobą)

  5. Teraz John postanowił rozwiązać ten konflikt i zaktualizować rzeczywistą zmianę, ale upuść inne:

    { "wyniki": [ { "nast": 4, "id": "rzeczą", "zmiany" : [{ "rev": "3-2502757951d6d7f61ccf48fa54b7e13c"}, { "rev": "2-13839535feb250d3d8290998b8af17c3"}]} ] "last_seq": 4}

  6. Czekaj, rewizji Mike'a nadal istnieje ? Czemu? John w panice zdejmuje dokument:

    { "Wyniki": [ { "nast": 5, "id": "rzeczą", "zmiany": [{ "rev": "2-13839535feb250d3d8290998b8af17c3"} { "rev": "4-149c48caacb32c535ee201b6f02b027b"}]} ] "last_seq": 5}

    teraz jego wersja dokumentu zostanie usunięta, ale jest w stanie uzyskać dostęp do jednego Mike'a.

  7. Replikacja John zmienia od bazy B do bazy woli wszystko przynosi nagrobek:

    { "Wyniki": [ { "nast": 3, "id": "rzecz", "zmiany": [ { "rev": "3-2adcbbf57013d8634c2362630697aab6"}, { "rev": "4-149c48caacb32c535ee201b6f02b027b"}]} ] "last_seq": 3}

    Dlaczego tak? Ponieważ jest to historia dokumentu o jego "ewolucji" danych: w prawdziwym świecie twoje dokumenty mogą zawierać wiele pośrednich list rozproszonych wśród dużej liczby baz danych i zapobiegać procesowi cichego nadpisywania danych z powodu należnej replikacji danych. CouchDB przechowuje każdy liść, aby pomóc w rozwiązywaniu takich konfliktów. Więcej i prawdopodobnie lepsze wyjaśnienie znajdziesz na wiki CouchDB na temat replication and conflicts. Zmiany paszy query parameters również zostały tam opisane.

+0

Niesamowite wytłumaczenie - dziękuję. Twój przykład był bardzo opisowy. Mój obecny projekt wykonuje tylko jedną replikację, więc na szczęście wierzę, że uniknę tej złożoności. Doceniam jednak link, który podałeś dla "replikacji i konfliktów", przeczytam o tym. Dziękuję Ci! –