添加具有自动递增的自定义 ID 的子项 - Firebase

Posted

技术标签:

【中文标题】添加具有自动递增的自定义 ID 的子项 - Firebase【英文标题】:Add child with automatically incremented custom ID - Firebase 【发布时间】:2017-12-05 11:45:42 【问题描述】:

我想用自动递增 id 向 firebase 数据库添加一个新用户,如下截图所示:

我试过了:

    var rootRef = firebase.database().ref();
    var storesRef = rootRef.child("/users");
    storesRef.set(
      "name": "user1",
      "pageId": "user1"
    );

【问题讨论】:

你需要用户ID是0,1,2,...吗?否则,您可以使用 Firebase 的内置 ID 生成,它还保留了创建顺序,因为它考虑了创建时间。 @alexkucksdorf 是的,需要用户 ID。因为我是从 quickblox 导入的 正如 Alex 所说:使用像这样按顺序、单调递增的 ID 将严重阻碍应用程序的可扩展性和离线行为。我建议您阅读 Firebase 博客文章:firebase.googleblog.com/2014/04/… 【参考方案1】:

我确实推荐这个,但您可以尝试以下方法:

storesRef.limitToLast(1).once('value', (snapshot) => 
    const nextID = parseInt(snapshot.key) + 1;
    let updates = ;
    updates['/users/' + nextID] = // your user;
    rootRef.update(updates);
);

但是,我强烈建议您改用 Firebases 自动生成的 ID,因为这种方法很容易出错。

你也应该看看this answer.

【讨论】:

【参考方案2】:

我花了很长时间试图为我自己的项目解决这个问题,但和往常一样,结果看起来很容易:

var newUserIndex;

storesRef.on('value', snap =>
  newUserIndex = snap.val().length;    
);

database.ref('users/' + newUserIndex).set(name:'user1', pageId:'user1');

因为数据库是从零开始的,所以 snap.val().length 总是给出需要的下一个索引。我认为使用 snap 可能会过度使用并且浪费资源(我才刚刚开始使用 Firebase,所以仍在掌握它) - 但是在控制台中检查使用统计信息,显然不是。

并非每个人都在构建具有多个用户且需要可扩展性的应用。我了解使用 push() 自动生成密钥的好处,但它并不总是适合小型项目和单用户项目的解决方案。

【讨论】:

以上是关于添加具有自动递增的自定义 ID 的子项 - Firebase的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 ADO.NET DataSet 和 DataAdapter 将树结构持久保存到具有自动递增 ID 的数据库表中

如何从 SQL Server 中的自定义数字自动增加主键? [关闭]

php Gravity Perks // GP媒体库//自动添加文件ID的自定义字段

在存储的 CLOB 中包含自动递增值

如何编写基于 Auto 递增值的 Oracle 触发器?

Java/Spring Boot Web 应用程序。插入具有自动递增 id 列的新行