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
。哦,你这个了不起的野兽-Dtrue+null=1
也是一个“有趣的”选项…:-)