2013-02-13 16 views
5

CouchDB'den _changes isteğine verilen yanıt şu biçimde gelir: {"seq": 12, "id": "foo", "değişiklikler": [{"rev": "1-23202479633c2b380f79507a776743d5"}]}CouchDB _changes yanıtında, "değişiklikler" öğeleri neden diziler?

Soruma Sorum neden "değişiklik" öğesi bir dizidir? Değişiklikler öğesinde birden fazla öğe hangi senaryoyu döndürür? Birden fazla öğeyle çevrimiçi bir örnek görmedim ve kendi deneyimimde yalnızca bir öğe gördüm.

Değişikliklerle etkileşime giren kod yazıyorum ve aslında birden fazla öğe varsa ne yapacağımı anlamak istiyorum.

sayesinde Mike

cevap

8

değişiklikler eleman tüm belge için revizyon yapraklarını var yansıtmak için bir dizidir. Bildiğiniz gibi, CouchDB belgeyi tamamen silmez, ancak daha önce henüz silinmemiş olan eski düzeltmesi olan kaynağından çoğaltıldıktan sonra yanlışlıkla yeniden dirilmesini önlemek için mezar taşı koyar. Ayrıca çoğaltma sonrası oluşan çakışmaların güncellenmesi nedeniyle birden fazla yaprak olması mümkündür. Örneğin:

  1. Mike veritabanı A'da belgeyi oluşturduk ve veritabanı B'ye onu çoğaltılır:

    { "sonuç": [ { "seq": 1, "id": "şey", "değişiklikler": [{ "rev": "1-967a00dff5e02add41819138abb3284d"}]} ], "last_seq": 1}

  2. John veritabanı B'de onu belgenizi alınan ve güncelledik:

    { "sonuç": [ { "Seq": 2, "id": "şey", "Değişiklikler": [{ "rev": "2-7051cbe5c8faecd085a3fa619e6e6337"}]} ], "last_seq": 2}

  3. Ama en Aynı Mike aynı zamanda, A:

    ("sonuç") için birkaç değişiklik yaptı (verileri temizlemek veya önemli bir şey eklemek için unuttum) {"results": [ {"seq": 2, "id": "thing" "değişiklik": [{ "devir": "2-13839535feb250d3d8290998b8af17c3"}]] } "last_seq": 2}

  4. ve veritabanı B. onu tekrar çoğaltılır3, "id": [ { "seq":

    { "sonuç": John çatışma durumunda değişiklikler bakarak belge style=all_docs Sonraki sonucu görmek sorgu parametresi ile beslemek aldığı "şey", "Değişiklikler": [{ "devir": "2-7051cbe5c8faecd085a3fa619e6e6337"}, { "devir": "2-13839535feb250d3d8290998b8af17c3"}]} ] "last_seq": 3}

    belgeye doğrudan erişim Yeme onun verileri döndürür iken revizyon (daha yüksek sq sayısıyla veya sadece en yeni) ile birçok çelişkili revizyona sahip olması mümkündür (tek bir belge için eşzamanlı yazmaların birbiri ardına çoğaltılmış düzinelerdeki veritabanları içinde olduğunu hayal edin)

  5. [ { "seq":

    { "sonuçlar": 0

  6. Şimdi John Bu çatışmayı çözmek ve gerçek revizyon güncelleme, ancak diğer düşmesi karar vermişti 4, "id": "şey", "değişiklikleri" : [{ "rev": "3-2502757951d6d7f61ccf48fa54b7e13c"}, { "rev": "2-13839535feb250d3d8290998b8af17c3"}]} ], "last_seq": 4}

  7. Bekle, Mike'ın revizyon hala orada ? Niye ya? "Id", 5: "şey", "Değişiklikler": [{ "rev": "2-13839535feb250d3d8290998b8af17c3"} {

    { "sonuç": [ { "seq" panik John belgeyi kaldırır "rev": "4-149c48caacb32c535ee201b6f02b027b"}]} ], "last_seq": 5}

    Şimdi belgenin onun sürümü silinir, ama Mike'ın birine erişebilir bu.

    { "sonuç": [ { "seq": 3, "id": "şey", "değişiklikleri" John veritabanı A'ya veritabanı B'den değiştirir çoğaltma

  8. olacak tüm mezar taşı getiriyor [ { "rev": "3-2adcbbf57013d8634c2362630697aab6"}, { "rev": "4-149c48caacb32c535ee201b6f02b027b"}]} ], "last_seq": 3}

    Neden bu kadar? Bu, "evrim" verileriyle ilgili belge tarihi olduğu için: gerçek dünyada belgeleriniz çok sayıda veri tabanı arasında dağıtılmış çok sayıda ara yaprağı içerebilir ve veri çoğaltma işlemi nedeniyle sessiz verilerin üzerine yazılmasını önlemek için CouchDB, her bir yaprağı bu tür çakışmaları çözmeye yardımcı olur. CouchDB wiki'sinde replication and conflicts ile ilgili daha fazla ve muhtemelen daha iyi bir açıklama bulabilirsiniz. Değişiklikler feed'i query parameters da orada açıklanmıştır.

+0

Harika bir açıklama - teşekkürler. Örneğiniz çok açıklayıcıydı. Şu anki projem sadece tek yönlü bir çoğaltma yapıyor, bu yüzden şükür ki bu karmaşıklığı engelleyeceğime inanıyorum. Ama "çoğaltma ve çatışmalar" için sağladığınız bağlantıyı takdir ediyorum, bunu okuyacağım. Teşekkür ederim! –