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。

然后您可以使用事务来确保两个客户端不会同时推送:

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 回答