根据Firebase文档,我正在获取文档参考,然后在Cloud Firestore中设置文档数据。
// Add a new document with a generated id.
var newCityRef = db.collection("cities").doc();
// later...
newCityRef.set(data);
但是,在我的应用程序中,不同的用户可以同时编写数百个文档。 firebase-firestore是否可以确保获取的文档参考不会被下一个用户重复使用?
例如: 用户1尝试插入文档,以便获得参考。 用户2也会尝试同时插入一个文档。由于用户1尚未完成其操作,用户2是否也可能获得与用户1相同的参考?
如果ifirestire无法处理此问题,那么正确的方法是什么? 预先感谢。
答案 0 :(得分:1)
您为newCityRef
获取的ID在全球范围内是唯一的,与您或其他客户同时创建的成百上千的文档ID不同。
在不带参数的情况下调用.doc()
函数时所获得的关于参考的documentation states this。
获取指定路径中集合中文档的DocumentReference。如果未指定路径,则自动生成的唯一ID 将用于返回的DocumentReference。
每次调用db.collection("cities").doc()
都会给您一个文档的唯一引用。您可以通过两次调用该函数并比较您获得的ID来进行尝试。
作为有关如何保证ID唯一性的参考,您可以阅读针对Firebase推送ID发布的文章“ The 2^120 Ways to Ensure Unique Identifiers”。 Firestore自动生成的ID遵循相同的原理(您可以看到source code for the JS SDK here)。
可以肯定地说,每个用户的文档参考都是唯一的,并且您最多可以同时编写the documented limits个文档。
答案 1 :(得分:1)
使用以下代码行时:
var newCityRef = db.collection("cities").doc();
没有将任何参数传递给doc()
函数,这意味着您在cities
集合中创建了对文档的唯一引用。在这种情况下,id的冲突极不可能发生。这就是文档ID的目的。因此,您不必担心它。
但是请注意,Firestore文档ID在同一集合中必须唯一。它们可以在其他集合或子集合中重复。您可以自己测试此功能。
因此请记住,当您在不传递任何参数的情况下调用CollectionReference的add()函数或CollectionReference的doc()函数时,Firestore中使用的唯一ID的内置生成器会生成随机且高度不可预测的ID ,这可以防止访问后端基础架构中的某些热点。
所有自动生成的文档ID都是随机的,并且几乎没有机会使其中两个冲突。客户端SDK生成一个包含20个字符的文档,每个字符允许:
因此,总共(26 + 26 + 10)^ 20 = 7.0e35个可能的唯一ID的可能组合,您可以/应该假定它们将是完全唯一的。