Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/firebase/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 如何为Firebase实时数据库创建增量ID?_Javascript_Firebase_Firebase Realtime Database - Fatal编程技术网

Javascript 如何为Firebase实时数据库创建增量ID?

Javascript 如何为Firebase实时数据库创建增量ID?,javascript,firebase,firebase-realtime-database,Javascript,Firebase,Firebase Realtime Database,所以在我的实时数据库中,它看起来像: ss: { xx: { id: 1 }, yy: { id: 2 }, ... } 我尝试首先获取ID最大的子项FirebaseRef.child('ss').orderByChild('ID').limitToLast(1),然后对检索到的值执行+1操作。。然后用它推送新记录。但这可能会导致id加倍,在抓取和推送之间,其他人可以制作新记录。我查看了事务功能,但无法确定在我的场景中必须使用该功能(因为它只检索和更新值?)

所以在我的实时数据库中,它看起来像:

ss: {
  xx: {
    id: 1
  },
  yy: {
    id: 2
  },
  ...
}

我尝试首先获取ID最大的子项
FirebaseRef.child('ss').orderByChild('ID').limitToLast(1)
,然后对检索到的值执行+1操作。。然后用它推送新记录。但这可能会导致id加倍,在抓取和推送之间,其他人可以制作新记录。我查看了
事务
功能,但无法确定在我的场景中必须使用该功能(因为它只检索和更新值?)

一种可能的方法是维护一个计数器,每次需要生成新id时,在a中递增此计数器并读取值:

下面应该可以做到这一点:

  //Declare a function that increment a counter in a transaction
  function getId() {
    var counterRef = firebase.database().ref('counter');
    return counterRef.transaction(function(currentId) {
      return currentId + 1;
    });
  }


  //Call the asynchronous getID() function
  getId().then(function(transactionResult) {
    var newId = transactionResult.snapshot.val();
    console.log(newId);
    firebase.database().ref('ss/xx').set({id: newId});
  });

您不需要创建
计数器
节点,它将在第一次调用
getId()
函数时自动创建。

我从未查看过Firebase,但它支持序列吗?普通的RDBMS通常都有这样的功能——它基本上是提供递增(或以其他方式定义)的数字作为ID。DB会在插入时自动处理此操作,因此您无需手动处理。在该操作中找不到任何内容。这就是我在这里问的原因。谢谢。另请参见:,,您确定
返回currentId+1在没有计数器的情况下是否足够?我通常会执行
返回(currentId | | 0)+1
@FrankvanPuffelen在中的示例中是这样做的,并且明确提到“//如果从未设置过users/ada/rank,则currentRank将为
null
”。我知道这一部分。但我从未意识到
null+1=1
。哦,你这个了不起的野兽-D
true+null=1
也是一个“有趣的”选项…:-)