Flutter и Firestore: Как обновить несколько конкретных документов из группы коллекций

# #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. Спасибо за ввод, я все еще учусь, но пример кода был бы полезен для второго варианта