Firebase:如何为密钥生成唯一的数字 ID?

Firebase: how to generate a unique numeric ID for key?

为了便于阅读,我需要数字 ID。我如何在 Firebase 中获取它?

我想要键的数字 ID,例如“000000001”、“000000002”、“00000003”、“00000004”。

我需要它的原因是因为这些ID将成为在线和离线的永久对象ID。我希望用户只需输入 URL "/objects/00000001" 即可轻松浏览该对象页面。

我在这里问,因为我想知道这是否可以在不使用 .priority、子属性等的情况下完成。我想 set 方法可以以某种方式做到这一点。如果不可能,就告诉我不,我可以接受这个答案。

我建议通读 Firebase 文档。具体来说,请参阅 Firebase JavaScript 网络指南的 Saving Data 部分。

来自指南:

Getting the Unique ID Generated by push()

Calling push() will return a reference to the new data path, which you can use to get the value of its ID or set data to it. The following code will result in the same data as the above example, but now we'll have access to the unique push ID that was generated

// Generate a reference to a new location and add some data using push()
var newPostRef = postsRef.push({
 author: "gracehop",
 title: "Announcing COBOL, a New Programming Language"
});

// Get the unique ID generated by push() by accessing its key
var postID = newPostRef.key;

来源:https://firebase.google.com/docs/database/admin/save-data#section-ways-to-save

  • 推送生成一个新的数据路径,服务器时间戳作为其 key。这些键看起来像 -JiGh_31GA20JabpZBfa,所以不是数字。
  • 如果你想制作一个只有数字的 ID,你可以将其作为 object 的参数以避免覆盖生成的密钥。
    • 键(新数据的路径)保证是唯一的,因此用数字键覆盖它们没有意义。
    • 您可以改为将数字 ID 设置为 object 的 child。
    • 然后您可以使用 Firebase Queries.
    • 通过该 ID child 查询 objects

来自指南:

In JavaScript, the pattern of calling push() and then immediately calling set() is so common that we let you combine them by just passing the data to be set directly to push() as follows. Both of the following write operations will result in the same data being saved to Firebase:

// These two methods are equivalent:
postsRef.push().set({
  author: "gracehop",
  title: "Announcing COBOL, a New Programming Language"
});
postsRef.push({
  author: "gracehop",
  title: "Announcing COBOL, a New Programming Language"
});

来源:https://firebase.google.com/docs/database/admin/save-data#getting-the-unique-key-generated-by-push

如上所述,您可以使用 Firebase 默认推送 ID。

如果你想要一些数字,你可以根据时间戳做一些事情来避免冲突

f.e。基于日期、小时、秒、毫秒的东西,最后是一些随机整数

01612061353136799031

转换为:

016-12-06 13:53:13:679 9031

这完全取决于您需要的精确度(社会安全号码与日期末尾的一些随机字符相同)。比如一天、一小时或一秒内预计会有多少笔交易。您可能希望降低精度以方便键入。

您还可以执行递增号码 ID 的交易,成功后您将拥有该用户的唯一连续号码。这些可以在客户端或服务器端完成。

(https://firebase.google.com/docs/database/android/read-and-write)

正如 the docs 所说,如果 push.

,则只需使用 set 即可实现

正如文档所说,不推荐这样做(因为可能会在 "same" 时被其他用户覆盖)。

但在某些情况下,控制 Feed 的内容(包括键)会很有帮助。

以js中的webapp为例,193是你在别处生成的id,简单地说:

 firebase.initializeApp(firebaseConfig);
  var data={
      "name":"Prague"
  };
  firebase.database().ref().child('areas').child("193").set(data);

这将覆盖任何标记为 193 的区域,或者创建一个尚不存在的区域。

https://firebase.google.com/docs/firestore/manage-data/transactions

使用事务并在数据库中的某处保留一个数字,您可以将其加一。这样你就可以获得一个漂亮的数字和简单的id。

添加到@htafoya 的回答中。 代码片段将是

const getTimeEpoch = () => {
    return new Date().getTime().toString();                             
}