我正在尝试为文档创建活动日志系统或历史记录,因此每次在文档中修改字段时,我都希望记录或保存该字段,以便在更改每个文档的历史记录后可以看到。
我该如何实现?我不想每次更改都保存完整的文档,然后有大量重复的文档,如果可能的话,我只想获取更改的字段(例如,名称:“ john”->名称:“ jack”)。>
答案 0 :(得分:0)
我不想在每次更改时都保存完整的文档,然后又有大量重复的文档
文档更改后,它将成为新文档。因此,除非进行以前的更改,否则您将没有重复的文档。另请注意,在Cloud Firestore中,没有字段级权限或对文档的访问。这是整个文档,或者什么也没有。因此,例如,您要更改文档中的字段,例如:
userName = "John"
进入
userName = "Jack"
您将获得整个文档,而不是仅获得已更改的userName
属性。
Cloud Firestore侦听器在文档级别触发。仅凭文档中的特定字段就无法触发。
如果只想通知特定字段,请考虑为仅包含这些字段的文档添加额外的集合。这种数据重复在NoSQL解决方案(例如Firestore)中非常普遍,为此,我建议您观看此视频Denormalization is normal with the Firebase Database,以更好地理解。它用于Firebase实时数据库,但与Cloud Firestore的原理相同。
对于数据库模式,您还可以通过此 post 查看我的答案。
答案 1 :(得分:0)
实现此类目标的最佳方法是将文档发生的before
和after
更改存储在新文档中,您可以将其添加到子集合中。云功能onUpdate
触发器提供了这些更改。我已经在博客上针对该主题进行了深入的探讨。
答案 2 :(得分:0)
您可以通过创建一个在所有集合中的所有文档更新时触发的云函数来获得这一点:
--trigger-resource=projects/$PROJECT_ID/databases/(default)/documents/{collection_id}/{document_id}
在云函数中,您可以通过数据对象获取所有更新的字段及其值。
Python 示例:
def main(data, context):
# Extract resource
resource = context.resource
resource_split = resource.split('/')
collection_name = resource_split[-2]
document_id = resource_split[-1]
# Get old fields
data_old_values = data['oldValue']
data_old_values_fields = data_old_values['fields']
# Get updated fields
data_updated_mask = data['updateMask']
data_updated_fields = data_updated_mask['fieldPaths']
# Get new field values
data_new_values = data['value']
data_new_values_fields = data_new_values['fields']
# `data_updated_fields` is a list of the fields that has been changed
# `data_old_values_fields` is a dictionary with the old values of the document
# `data_new_values_fields` is a dictionary with the new values of the document