# #firebase #flutter #google-cloud-firestore
Вопрос:
Итак, у меня есть несколько одинаковых идентификаторов документов, но каждый из них используется для разных коллекций и целей. Используя группу коллекций, поскольку эти документы вложены во вложенные коллекции, я смог найти эти документы и распечатать их. Как бы я мог обновить определенное поле во всех этих документах одновременно с некоторыми другими данными? В моем случае эти документы, несмотря на то, что они находятся в разных коллекциях, имеют поле под названием, plastics
и я хочу обновить их данными int.
Вот код, который я использовал для извлечения этих документов и фильтрации, чтобы печатать только те, которые мне конкретно нужны:
final String uid = FirebaseAuth.instance.currentUser.uid;
QuerySnapshot querySnapshot = await FirebaseFirestore
.instance
.collectionGroup("Members")
.get();
for (int i = 0; i < querySnapshot.docs.length; i ) {
var a = querySnapshot.docs[i];
if (a.id == uid) {
print(a.id);
}
}
Также вот некоторый код, который я использовал раньше для обновления поля в одном документе, но не все из них, как мне нужно в данном случае.
Future<bool> addPlastic(String amount) async {
try {
String uid = auth.currentUser.uid;
var value = double.parse(amount);
DocumentReference documentReference =
FirebaseFirestore.instance.collection('some collection').doc(some document);
FirebaseFirestore.instance.runTransaction((transaction) async {
DocumentSnapshot snapshot = await transaction.get(documentReference);
if (!snapshot.exists) {
documentReference.set({'plastics': value});
return true;
}
double newAmount = snapshot.data()['plastics'] value;
transaction.update(documentReference, {'plastics': newAmount});
return true;
});
} catch (e) {
return false;
}
}
Ответ №1:
У вас есть два варианта: либо просмотреть все коллекции и вложенные коллекции (утомительно), либо сохранить список ссылок на документы в одном из документов и изменить данные, просмотрев все эти ссылки на документы ( лучший вариант). Если вам нужен какой-то код или рекомендации о том, как это сделать, дайте мне знать.
Редактировать
Чтобы использовать справочную часть документа, во-первых, при создании документа вам нужно сделать что-то вроде этого
document(id).set({
"value1":"oko",
"plastic":"240",
//And the rest of your values
"otherSnapshots":[/*Your list of documentSnapshots with the same ID. Update it in this whenever you have new one by following the next snippet*/]
})
При создании нового документа перейдите к этому и добавьте ссылку на документ с помощью
snapshot.reference.update({
'otherSnapshots':FieldValue.arrayUnion([/*Document Reference*/])
});
И в следующий раз, когда вы захотите обновить их все, используйте это поле, пролистайте его, и тогда вы получите все ссылки на документы. Я не могу создать код, который вы можете напрямую скопировать и вставить в свой код, не видя, как вы храните данные
Комментарии:
1. Спасибо за ввод, я все еще учусь, но пример кода был бы полезен для второго варианта