2013-02-15 72 views
5

說我有以下結構:Firebase:如何推進交易?

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

我想用添加另一個類似項目一個GUID作爲重點和優先級等於當前所呈現的(在這種情況下2)的項目數。結果應該是這個樣子:

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

注意,由於多個客戶端可以嘗試在同一時間加入這樣的項目,這必須是一個事務。

任何想法?

回答

3

當您使用push()時,每個項目被分配一個唯一的ID。所以交易不是必須的(不能碰撞)。

如果您希望記錄按優先級排序(這看起來像您要完成的),我認爲您應該簡單地使用優先級作爲ID。

然後你可以使用事務,以確保兩個客戶不會在同一時間推:

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 */ 
}); 

但是,如果您使用的是優先級作爲一個獨特的ID,也許這需要重新思考;這真的是ID工作,它做得很好;記錄也按照它們插入的順序進行維護,因此在大多數情況下計數器是不必要的。

+0

謝謝加藤!我還應該注意到,如果你使用push(),這些項目會按照它們被添加的順序顯示出來(只要它們是從同一個客戶端推送的,其他客戶端可能會有偏斜的時鐘,我們試圖補償,但並非總是100%成功)。 – 2013-02-15 18:13:45