【问题标题】:Assign Incremental User ID Numbers in Firestore在 Firestore 中分配增量用户 ID 号
【发布时间】:2019-09-09 20:51:18
【问题描述】:

我们有一个带有 google firestore 数据库的 vuejs 项目,我们需要为所有用户分配一个唯一的文件编号。它必须是数字,6 位,从 000052 开始。

我们有大约 4500 名用户。

我想使用谷歌云功能。如何将这个文件号分配给每个用户,每个用户都递增?

我正在尝试使用 firestore 的限制查询来查找前一个用户,然后增加当前用户中的文件编号等,但这似乎很笨拙。

db.collection('users').orderBy(id).get()
.then((snapshot) => {
  snapshot.forEach(doc => {
    let last = snapshot.docs[snapshot.docs.length - 1];
    let next = db.collection('users')
    .startAfter(last.data().id)
    .limit(1)
    db.collection('users').doc(next.id).set({
      fileId: last.id++
    })
  })
})

【问题讨论】:

  • 你试过什么?有什么问题吗,或者你写的东西没有按你预期的方式工作?
  • 嘿道格...老实说,我不确定最好的方法。我试过简单地从 firebase 用户 uid 中删除非数字,但字符并不总是足够的,也不能保证结果是唯一的
  • 我正在尝试使用 firestore 的限制查询来查找前一个用户,然后在下一个用户中增加文件编号,但这似乎很笨重。

标签: javascript google-cloud-firestore google-cloud-functions


【解决方案1】:

我能想到的几个选项:

  • 您当前的方法可以奏效,只要您:

    • 按 ID降序排序,以确保您获得最后/最高的 ID。
    • 使用事务更新数据库,并使用安全规则拒绝用户覆盖现有 ID。
  • 如果您有一个使用这些 ID 作为文档键的集合,那么保证唯一性可能会更简单,因为根据定义,ID 在其集合中是唯一的。这可以是您的当前/主要集合,也可以是仅跟踪声明的 ID 的辅助集合。在这里,交易+安全规则也是确保唯一性的关键。

  • 或者,您可以在您的方案中生成一个随机 ID,然后执行与之前方法相同的事务+规则逻辑。

  • 您还可以创建一个文档来保留您提供的最高 ID,然后为每个新用户读取-增量-写入该文档。同样,这需要在事务中完成。这与有多少数据库系统增加其自动增量值非常接近。

【讨论】:

  • ID 在其集合或整个项目中是唯一的?是否有可能在同一个 Firebase 项目中存在的两个不同集合中存在重复 ID?
  • 是的。但请注意,从 Firestore 自动生成的 ID 在统计上保证是唯一的。
猜你喜欢
  • 2012-10-09
  • 1970-01-01
  • 2011-11-23
  • 1970-01-01
  • 2012-10-14
  • 1970-01-01
  • 1970-01-01
  • 2020-06-08
相关资源
最近更新 更多