2013-02-13 31 views
5

Phản hồi từ CouchDB tới yêu cầu _changes quay lại theo định dạng sau: {"seq": 12, "id": "foo", "changes": [{"rev": "1-23202479633c2b380f79507a776743d5"}]}Trong câu trả lời của CouchDB _changes, tại sao các mảng yếu tố "thay đổi"?

Câu hỏi của tôi - tại sao phần tử "thay đổi" là một mảng? Kịch bản nào sẽ trả về nhiều mục trong phần tử thay đổi? Tôi chưa bao giờ thấy một ví dụ trực tuyến với nhiều mục, và theo kinh nghiệm của riêng tôi, tôi chỉ thấy một mục.

Tôi đang viết mã tương tác với các thay đổi và tôi muốn hiểu phải làm gì nếu, trên thực tế, có nhiều mục.

Cảm ơn, Mike

Trả lời

8

Yếu tố thay đổi này là một mảng để phản ánh tất cả các tồn tại lá sửa đổi cho tài liệu. Như bạn đã biết, CouchDB không xóa hoàn toàn tài liệu, nhưng đặt bia mộ thay vào đó để ngăn chặn sự phục sinh vô tình của anh ta sau khi sao chép từ nguồn có bản sửa đổi cũ hơn của anh ta chưa bị xóa. Cũng có thể có nhiều lá do các xung đột cập nhật xảy ra sau khi sao chép. Ví dụ:

  1. Mike đã tạo ra tài liệu cơ sở dữ liệu A và nhân rộng nó tới cơ sở dữ liệu B:

    { "Kết quả": [ { "seq": 1, "id": "điều", "thay đổi": [{ "rev": "1-967a00dff5e02add41819138abb3284d"}]} ], "last_seq": 1}

  2. John đã nhận được tài liệu của bạn và cập nhật ông trong cơ sở dữ liệu B:

    { "kết quả": [ { "Seq": 2, "id": "điều", "thay đổi": [{ "rev": "2-7051cbe5c8faecd085a3fa619e6e6337"}]} ], "last_seq": 2}

  3. Nhưng tại Mike cũng đã thực hiện một số thay đổi (quên xóa dữ liệu hoặc thêm nội dung quan trọng) cho anh ta trong cơ sở dữ liệu A:

    {"results": [ {"seq": 2, "id": "thing" , "thay đổi": [{ "rev": "2-13839535feb250d3d8290998b8af17c3"}]} ], "last_seq": 2}

  4. Và lặp lại ông một lần nữa để cơ sở dữ liệu B.John nhận được tài liệu trong trạng thái xung đột và bằng cách nhìn vào những thay đổi ăn với tham số truy vấn style=all_docs xem kết quả tiếp theo:

    { "Kết quả": [ { "seq": 3, "id": "điều", "thay đổi": [{ "rev": "2-7051cbe5c8faecd085a3fa619e6e6337"}, { "rev": "2-13839535feb250d3d8290998b8af17c3"}]} ], "last_seq": 3}

    Trong khi truy cập trực tiếp vào tài liệu trả về dữ liệu của mình từ trúng sửa đổi (với số seq cao hơn hoặc mới nhất) có thể cho anh ta có nhiều bản sửa đổi xung đột (tưởng tượng đồng thời viết cho một tài liệu duy nhất trong vòng tá cơ sở dữ liệu được nhân bản giữa nhau)

  5. Bây giờ John đã quyết định giải quyết cuộc xung đột này và cập nhật bản sửa đổi thực tế, nhưng thả bản sửa đổi đó:

    {"results": [ {"seq": 4, "id": "thing", "changes" : [{ "rev": "3-2502757951d6d7f61ccf48fa54b7e13c"}, { "rev": "2-13839535feb250d3d8290998b8af17c3"}]} ], "last_seq": 4}

  6. Chờ, sửa đổi của Mike vẫn còn đó ? Tại sao? John trong hoảng loạn xóa tài liệu của mình:

    {"results": [ {"seq": 5, "id": "thing", "changes": [{"rev": "2-13839535feb250d3d8290998b8af17c3"} { "rev": "4-149c48caacb32c535ee201b6f02b027b"}]} ], "last_seq": 5}

    Bây giờ phiên bản mình của tài liệu bị xóa, nhưng anh ta có thể truy cập vào một của Mike.

  7. Sao chép John thay đổi từ cơ sở dữ liệu B để cơ sở dữ liệu Một tất cả sẽ mang đến cho bia mộ:

    { "Kết quả": [ { "seq": 3, "id": "điều", "thay đổi": [ { "rev": "3-2adcbbf57013d8634c2362630697aab6"}, { "rev": "4-149c48caacb32c535ee201b6f02b027b"}]} ], "last_seq": 3}

    Tại sao như vậy? Bởi vì đây là lịch sử tài liệu về "tiến hóa" của ông: trong thế giới thực, tài liệu của bạn có thể có nhiều lá trung gian được phân phối trong số lượng lớn cơ sở dữ liệu và để ngăn chặn dữ liệu im lặng ghi đè quá trình sao chép dữ liệu do CouchDB giữ mỗi lá để giúp giải quyết xung đột đó. Nhiều hơn và có lẽ giải thích tốt hơn bạn có thể tìm thấy trong CouchDB wiki về replication and conflicts. Thay đổi nguồn cấp dữ liệu query parameters cũng được mô tả ở đó.

+0

Giải thích tuyệt vời - cảm ơn bạn. Ví dụ của bạn rất mô tả. Dự án hiện tại của tôi chỉ thực hiện sao chép một chiều, vì vậy rất may là tôi tin rằng tôi sẽ tránh được sự phức tạp này. Nhưng tôi đánh giá cao liên kết bạn cung cấp cho "nhân rộng và xung đột", tôi sẽ đọc về điều này. Cảm ơn bạn! –

Các vấn đề liên quan