使用数字序列定义 Firestore 文档字段值

Posted

技术标签:

【中文标题】使用数字序列定义 Firestore 文档字段值【英文标题】:Using a number sequence to define Firestore document field value 【发布时间】:2019-12-09 11:09:00 【问题描述】:

我想将用户信息及其 id(不是文档 id)存储在文档中。 我想生成像 XYZ0001 这样的 id 特定格式,只要有新用户添加,最后 4 位数字就会自动增加。 例如,XYZ0001、XYZ0002 之类的。 这个我试过了...

return firestore
          .collection("xyzData")
          .doc(resp.user.uid)
          .set(
            firstName: newUser.firstName,
            lastName: newUser.lastName,
            email: newUser.email,
            ca_id: "XYZ" + pad(firestore.collection("xyzData").count())
          )
          .then

pad() 是一个函数,它给我最后 4 位数字

function pad(n) 
  var s = "000" + n;
  return s.substr(s.length - 4);

但这给了我一个错误,即 count() 不是函数

另外,我在想另一种方法,我可以读取最后一个 id 的值,然后为下一个用户将其增加一个,bust 将无法实现它。

【问题讨论】:

【参考方案1】:

请注意,CollectionReference 没有 count() 方法。如果您想知道集合中的文档数量,您需要调用 asynchronous get() 方法来获取 QuerySnapshot,然后使用 size 属性。但是,您不能将调用 get() 作为对象的属性。


解决办法是维护你自己的计数器。

有两种标准方法:

使用firebase.firestore.FieldValue.increment()

正如in the doc 解释的那样,您可以调用firebase.firestore.FieldValue.increment() 来增加Firestore 文档的特定字段。例如,您可以在 counter 集合中拥有一个文档,每次您想从序列中获取新值时,您都会递增和读取该文档。根据您的具体用例,您可能需要使用Transaction

还要注意“您每秒只能更新一个文档一次”。

分布式计数器

如果您需要每秒更新一次以上的计数器文档,您应该按照doc 中的说明使用分布式计数器。

【讨论】:

我制作的那个id是为了不同的目的 哦,是的,我的错误,对不起!我不知道为什么,但我以为您想使用序列号作为文档 ID!我将删除答案的第一部分。请注意,维护您自己的计数器的部分仍然有效。 非常感谢,解决了这个问题,现在,将尝试实施您建议的第二种方法...感觉更可靠的解决方案

以上是关于使用数字序列定义 Firestore 文档字段值的主要内容,如果未能解决你的问题,请参考以下文章

在 java 类中为 firestore 文档指定序列化名称

Cloud Firestore 文档添加给出错误“参数“数据”的值不是有效的 Firestore 文档。不能使用“未定义”作为 Firestore 值”

Cloud Firestore:将字段值添加到文档

使用函数和 Firestore 时未定义字段值

Firestore 将值添加到数组字段

FieldValue.delete() 不会删除 firestore 文档中的字段键