使用 push() 方法创建没有唯一键的新子位置

Posted

技术标签:

【中文标题】使用 push() 方法创建没有唯一键的新子位置【英文标题】:Using push() method to create new child location without unique key 【发布时间】:2018-08-09 18:20:08 【问题描述】:

在我的 firebase 网络应用程序中,当新用户使用他们的电子邮件注册时,我会在根 ref 下的电子邮件地址下创建一个节点

但问题是使用 push() 方法将每个新用户添加到数据库中,每个用户都是使用如下所示的唯一键创建的

-用户

----ASFTU578FE

---------用户:user1@email.com

----FDWWE36S46

---------用户:user2@email.com

----WERSRTT23W

---------用户:user3@email.com

现在我如何访问用户的路径,因为我不知道将为每个新用户创建的唯一密钥

有没有办法在没有唯一键的情况下推送新用户,但我知道的键如 user.displayName 或 user.email

【问题讨论】:

【参考方案1】:

调用push 会生成一个带有自动计算密钥的位置。

要在您自己确定密钥的路径上写一个孩子,您只需调用child("key").set(value)

如果您将 Firebase 身份验证用户存储在数据库中,惯用的方法是将它们存储在他们的 uid 下。

var user = firebase.auth().currentUser;
var usersRef = firebase.database().ref("users");
if (user) 
  usersRef.child(user.uid).set( 
    displayName: displayName,
    email: email,
    photoUrl: photoUrl,
    emailVerified: emailVerified
  );

【讨论】:

这是正确的答案。 @Vamsi Krishna 认为用户将来可能会更改他们的电子邮件地址。对于此类用例,uid 保持稳定。 我多次浏览文档,仅提到如何引用孩子而不是装箱,非常感谢您,另一个问题是如果我用 user.email 添加孩子,它不能正常工作,但可以使用 user.uid,,,不知道为什么,,,,再次非常感谢你 树中的节点在您写入值时创建,在您删除值时删除。所以没有办法显式创建或删除节点。 @rkrish 这是因为在 Hashmap 中,您不能将字符串存储在具有“。”的 Key 属性中。这就是为什么您无法在孩子中添加电子邮件的原因。由于uid没有任何“。”其中的字符串,这就是为什么可以将其添加为子项的原因。如果您觉得这很有用,请为答案投票。

以上是关于使用 push() 方法创建没有唯一键的新子位置的主要内容,如果未能解决你的问题,请参考以下文章

angularjs如何使用.push克隆具有相同位置的图像?

Django ORM - 我可以使用 ID 以外的其他列创建具有外键的新对象吗?

ObjectMapper 和具有唯一键的数组

从 JavaScript 中已知的一组潜在 ID 创建唯一字符串 ID/键的快速方法

失效主键唯一索引还存在的一种解决方法

主键和唯一键的区别