Как избежать двойной записи в Cloud Firestore при загрузке файла хранилища с использованием идентификатора документа и передачи DownloadURL

Я работаю над приложением Flutter, подключенным к Firebase Cloud Firestore and Storage, и хочу создать в Cloud Firestore документы, содержащие URL-адрес загрузки файлов в хранилище. Однако мне также нужно, чтобы имя файла было уникальным идентификатором того же документа Firestore. Прямо сейчас я загружаю файл после создания документа, но впоследствии мне потребуется дополнительная запись для обновления документа Firestore.

Я хочу предотвратить это. Это могло бы сработать, если бы я мог получить доступ к идентификатору вновь созданного документа в функции add(), чтобы я мог передать его в storageTask, который вернет URL-адрес загрузки непосредственно внутри функции add(). Другим вариантом было бы, если бы я мог создать документ, получить его идентификатор, затем выполнить задачу загрузки и записать все данные после этого, но я не уверен, будет ли это считаться одной записью или двумя, и я не знаю, как для создания документа без установки каких-либо данных.

У меня сейчас примерно так:

CollectionReference activities = FirebaseFirestore.instance.collection('activities');
activities.add({
    'postDate': DateTime.now(),
}).then((value) => _startUpload(id: value.id));

Где _startUpload — это функция, которая загружает файл в хранилище и потенциально может вернуть URL-адрес загрузки. Я хочу иметь доступ к этому URL-адресу в функции добавления следующим образом:

CollectionReference activities = FirebaseFirestore.instance.collection('activities');
activities.add({
    'postDate': DateTime.now(),
    'downloadURL': _startUpload(id: SomehowGetThisDocuments.id)
});
Интеграция Angular - Firebase Analytics
Интеграция Angular - Firebase Analytics
Узнайте, как настроить Firebase Analytics и отслеживать поведение пользователей в вашем приложении Angular.
0
0
292
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Вы можете сделать что-то вроде того, что описано в последнем абзаце этого раздела документации:

newActivityRef = activities.document();
newActivityRef.set({
    'postDate': DateTime.now(),
    'downloadURL': _startUpload(id: newActivityRef.documentID)
});

Это должно считаться одной записью, поскольку согласно документации .document().set() эквивалентно .add().

Другие вопросы по теме