2013-02-15 24 views
5

Nói rằng tôi có cơ cấu như sau:Firebase: Cách đẩy vào giao dịch?

{ 
    "-InSwU2yHOEHwhP_m4_n" : { 
    ".priority" : 0.0, 
    "name" : "abc" 
    }, 
    "-InSw_P0j8A-0Njj0Uvf" : { 
    ".priority" : 1.0, 
    "name" : "def" 
    } 
} 

Tôi muốn thêm một mục tương tự với một guid như một chìa khóa và ưu tiên tương đương với số lượng các mặt hàng hiện đang trình bày (trong trường hợp này 2). Kết quả sẽ trông giống như sau:

{ 
    "-InSwU2yHOEHwhP_m4_n" : { 
    ".priority" : 0.0, 
    "name" : "abc" 
    }, 
    "-InSw_P0j8A-0Njj0Uvf" : { 
    ".priority" : 1.0, 
    "name" : "def" 
    }, 
    "-InSxV-RVkZ07_f3uDnJ" : { 
    ".priority" : 2.0, 
    "name" : "ghi" 
    } 
} 

Lưu ý rằng vì nhiều khách hàng có thể thử thêm mục đó cùng một lúc, đây phải là giao dịch.

Bất kỳ ý tưởng nào?

Trả lời

3

Khi bạn sử dụng push(), mỗi mục được gán một ID duy nhất. Vì vậy, một giao dịch sẽ không cần thiết (không thể có xung đột).

Nếu bạn muốn các bản ghi là duy nhất theo mức độ ưu tiên (trông giống như những gì bạn đang cố gắng hoàn thành), tôi nghĩ bạn chỉ nên sử dụng mức độ ưu tiên làm ID.

Sau đó, bạn có thể sử dụng một giao dịch để đảm bảo hai khách hàng không đẩy cùng một lúc:

FB.child(path).transaction(function(current_val) { 
    if(current_val === null) { 
     /* set the value here */ 
    } 
    /* do nothing; transaction fails because it was already written */ 
}, function(success) { 
    /* transaction done */ 
}); 

Tuy nhiên, nếu bạn đang sử dụng ưu tiên như một ID duy nhất, có lẽ điều này cần phải được xem xét lại ; đây thực sự là công việc của ID và nó thực hiện một công việc tuyệt vời; các bản ghi cũng được duy trì theo thứ tự chúng được chèn vào nên bộ đếm không cần thiết trong hầu hết các trường hợp.

+0

Cảm ơn Kato! Tôi cũng nên lưu ý rằng nếu bạn sử dụng push(), các mục sẽ hiển thị theo thứ tự mà chúng được thêm vào (miễn là chúng được đẩy từ cùng một ứng dụng khách. Các ứng dụng khách khác có thể có các đồng hồ bị lệch, mà chúng tôi cố gắng bù lại nhưng không phải lúc nào cũng thành công 100%). –