6

次の構造があるとします。

{
  "-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"
  }
}

複数のクライアントが同時にそのようなアイテムを追加しようとする可能性があるため、これはトランザクションでなければならないことに注意してください。

何か案は?

4

1 に答える 1

3

を使用するpush()と、各アイテムに一意の ID が割り当てられます。したがって、トランザクションは必要ありません (衝突はあり得ません)。

レコードを優先度によって一意にしたい場合 (これは達成しようとしているように見えます)、単純に優先度を ID として使用する必要があると思います。

次に、トランザクションを使用して、2 つのクライアントが同時にプッシュしないようにします。

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 の仕事であり、すばらしい仕事をします。レコードも挿入された順序で保持されるため、ほとんどの場合、カウンターは不要です。

于 2013-02-15T14:23:01.807 に答える