【发布时间】:2021-05-14 04:43:30
【问题描述】:
是否可以使用多个文档字段来确保唯一性。
例如:
在一个名为“books”的集合中,文档包含以下字段:作者、标题和出版日期。
应该允许新文档与另一个文档具有相同的作者。
新文档也可以与另一个文档具有相同的标题。
但是,如果所有三个字段都与数据库中的另一个文档相同,则不应允许写入新文档。
【问题讨论】:
标签: firebase google-cloud-firestore
是否可以使用多个文档字段来确保唯一性。
例如:
在一个名为“books”的集合中,文档包含以下字段:作者、标题和出版日期。
应该允许新文档与另一个文档具有相同的作者。
新文档也可以与另一个文档具有相同的标题。
但是,如果所有三个字段都与数据库中的另一个文档相同,则不应允许写入新文档。
【问题讨论】:
标签: firebase google-cloud-firestore
如果您希望某些内容独一无二,请将其用作文档的 ID。如果您希望值的组合是唯一的,请将该值组合用作文档的 ID。
因此,在您的情况下,您应该使用 author + title + publication date 作为文档的 ID。当您这样做时,它们在定义上将是独一无二的。
另见:
【讨论】:
任务听起来很简单,但不幸的是,Firebase 中两个数据库的数据库规则都不支持查询。这意味着您无法检查具有特定字段值的文档是否存在,因为您无法搜索它。
您可以使用两种可能的解决方案来完成您的任务。
1:使用authors 和titles 创建一个集合,其中键是作者姓名。我们现在为books 编写规则,如果request.data.auth && request.data.title 存在于这两个集合中,则不能创建文档。下一部分将是如果创建成功将author 和title 添加到这两个集合到lock 它们以供将来操作。您可以从客户端执行此操作,甚至可以为您执行此操作的自动化云功能。考虑到云函数可以有一个cold start,并且集合可能需要一些时间才能获得作者和标题的locked。
2:您可以创建一个callable 云函数并将图书数据发送给它。该函数将手动查询集合并检查是否存在具有相同作者和标题的书籍,如果不存在则创建一个。
【讨论】: