Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/lua/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Google cloud firestore Firestore规则';允许创建';创建具有不同ID的文档(如果已存在)_Google Cloud Firestore_Firebase Security - Fatal编程技术网

Google cloud firestore Firestore规则';允许创建';创建具有不同ID的文档(如果已存在)

Google cloud firestore Firestore规则';允许创建';创建具有不同ID的文档(如果已存在),google-cloud-firestore,firebase-security,Google Cloud Firestore,Firebase Security,我有一个Firestore允许创建规则,如果文档ID已经存在,则禁止创建该文档。我想做的是在发生这种情况时使用不同的随机ID创建一个新文档 例如,我想创建10个ID为1,2,3…10的文档。但是,ID2、3、4已经存在,并且不会被创建,所以我想要创建3个带有随机ID的文档(比如11、12、13) 我怎样才能做到这一点?谢谢。安全规则无法帮助您执行此操作。另外,您所尝试做的不太适合Firestore,我也将讨论这一点 在安全规则中检查任何其他文档内容的唯一方法是调用或,每次规则求值最多只能调用10

我有一个Firestore
允许创建
规则,如果文档ID已经存在,则禁止创建该文档。我想做的是在发生这种情况时使用不同的随机ID创建一个新文档

例如,我想创建10个ID为1,2,3…10的文档。但是,ID2、3、4已经存在,并且不会被创建,所以我想要创建3个带有随机ID的文档(比如11、12、13)


我怎样才能做到这一点?谢谢。

安全规则无法帮助您执行此操作。另外,您所尝试做的不太适合Firestore,我也将讨论这一点

在安全规则中检查任何其他文档内容的唯一方法是调用或,每次规则求值最多只能调用10次。因此,一旦您获得超过10个文档,您就无法检查足够的文档来强制执行文档ID编号

除此之外,Firestore并不适合在其打算操作的大规模上使用顺序文档ID。首选方法是在客户端上使用add()生成随机文档ID。如果需要对这些文档施加某种排序,则应该使用文档字段值,或者使用另一个文档,该文档具有定义顺序的数组

如果出于某种原因,您很难要求具有严格顺序的文档ID,那么您可能需要重新思考为什么在NoSQL类型的数据库中需要它。Firestore并不打算解决这种可扩展的情况


如果文档已经存在,
allow-create
规则永远不会触发,这也毫无价值。文档存在后,客户端只能更新或删除它。如果要阻止客户端更新已存在的文档,只需确保没有允许该更新发生的
允许写入
允许更新
规则。

安全规则将无法帮助您执行此操作。另外,您所尝试做的不太适合Firestore,我也将讨论这一点

在安全规则中检查任何其他文档内容的唯一方法是调用或,每次规则求值最多只能调用10次。因此,一旦您获得超过10个文档,您就无法检查足够的文档来强制执行文档ID编号

除此之外,Firestore并不适合在其打算操作的大规模上使用顺序文档ID。首选方法是在客户端上使用add()生成随机文档ID。如果需要对这些文档施加某种排序,则应该使用文档字段值,或者使用另一个文档,该文档具有定义顺序的数组

如果出于某种原因,您很难要求具有严格顺序的文档ID,那么您可能需要重新思考为什么在NoSQL类型的数据库中需要它。Firestore并不打算解决这种可扩展的情况


如果文档已经存在,
allow-create
规则永远不会触发,这也毫无价值。文档存在后,客户端只能更新或删除它。如果要阻止客户端更新已存在的文档,只需确保没有允许更新的
allow write
allow update
规则。

谢谢您的解释,@Doug。实际上,ID不是顺序的——我只是以它为例。基本上,我的应用程序是一个抽奖票务系统,因此如果用户想要10张票,它将生成10个随机ID介于1111111和99999999之间的文档。我目前正在使用
allowcreate:if!exists(…/$(id))
如果您担心客户端会生成一个副本,那么您只需在编写它之前检查它是否存在。正如我在回答中所说,
allow create
对现有文档没有任何作用。您可能只需要一个规则来阻止客户端对现有文档执行任何操作,但很难从您的要求中分辨出来。谢谢,这是最初的设计(在创建之前检查是否存在),但随着票证数量增加到1000多张,这一设计变得越来越慢。因此,如果,假设100人想要生成200张票,系统将执行一个if-exists生成另一个id-else创建新的20000次。有什么更好的建议吗?还是我只是偏执狂?我想你是偏执狂。检查和设置文档并不是很慢。Firestore事务就是这样工作的,人们总是使用它们来安全地添加文档,而不会破坏现有文档。感谢您的解释,@Doug。实际上,ID不是顺序的——我只是以它为例。基本上,我的应用程序是一个抽奖票务系统,因此如果用户想要10张票,它将生成10个随机ID介于1111111和99999999之间的文档。我目前正在使用
allowcreate:if!exists(…/$(id))
如果您担心客户端会生成一个副本,那么您只需在编写它之前检查它是否存在。正如我在回答中所说,
allow create
对现有文档没有任何作用。您可能只需要一个规则来阻止客户端对现有文档执行任何操作,但很难从您的要求中分辨出来。谢谢,这是最初的设计(在创建之前检查是否存在),但随着票证数量增加到1000多张,这一设计变得越来越慢。因此,如果,假设100人想要生成200张票,系统将执行一个if-exists生成另一个id-else创建新的20000次。有什么更好的建议吗?还是我只是偏执狂?我想你是偏执狂。检查和设置文档并不是很慢。这就是Firestore交易的运作方式