首页 > 解决方案 > Flutter - 在 Firestore 中删除文档会导致删除随机文档而不是所选文档

问题描述

“utenti”(用户)集合包含每个用户的文档,该文档又包含“salvataggi”(保存)集合以在应用程序中保存对象。

'salvataggi'(保存)中的每个文档都有一个自动生成的 id,其中包含一系列数据(准确地说是字符串)。

'salvataggi'(保存)中的文档可以通过将其他两个集合创建的对象始终保存在 FIrestore 中来添加。

当我想通过一个按钮从“salvataggi”(保存)集合中删除一个对象时,会删除一个随机文档,而不是与该对象对应的文档。

Firestore 的屏幕截图

对象 1

final CollectionReference _usersRef =
          FirebaseFirestore.instance.collection('utenti');

      final User _user = FirebaseAuth.instance.currentUser;

      //Add
      Future _addToSaved() { 
        return _usersRef.doc(_user.uid).collection('salvataggi').doc().set({
          'fonte': elenco.fonte,
          'title': elenco.title,
          'url': elenco.urlAvv,
          'imageEv': elenco.urlAvv,
          'p1': elenco.iconaProspettiva1,
          'p1url': elenco.urlProspettiva1,
        });
      }
       
      //Remove
      Future _removeFromSaved() async { 
        CollectionReference userSaved =
            _usersRef.doc(_user.uid).collection('salvataggi');

        QuerySnapshot querySnap = await userSaved.get();

        querySnap.docs[0].reference.delete();
      }

对象 2

final CollectionReference _usersRef =
      FirebaseFirestore.instance.collection('utenti');

  final User _user = FirebaseAuth.instance.currentUser;

  //Add
  Future _addToSaved() {
    return _usersRef.doc(_user.uid).collection('salvataggi').doc().set({
      'fonte': widget.single.fonte,
      'title': widget.single.title,
      'url': widget.single.urlAvv,
      'imageEv': widget.single.imageEvAvv,
      'lastupdate': widget.single.dataAggiornamento,
      'p1': widget.single.iconaProspettiva1,
      'p1url': widget.single.urlProspettiva1,
      
    });
  }
  
  //Remove
  Future _removeFromSaved() async {
    CollectionReference userSaved =
        _usersRef.doc(_user.uid).collection('salvataggi');

    QuerySnapshot querySnap = await userSaved.get();

    querySnap.docs[0].reference.delete();
  }

我究竟做错了什么?为什么会这样?

标签: firebasefluttergoogle-cloud-firestoredata-modeling

解决方案


当用户保存文档时,请尝试使用它保存该文档的 id,以便每当用户取消保存文档时。您可以将该未保存文档的 ID 传递给 Firestore。

它看起来像这样

  Future _removeFromSaved(String docID) async {
    CollectionReference userSaved =
        _usersRef.doc(_user.uid).collection('salvataggi');

    await userSaved.doc(docID).delete()
  }

- 更新 -

您可以在将文档添加到 Firestore 后调用该then方法保存文档 ID,然后对其进行更新

  Future _addToSaved()async {
    await _usersRef.doc(_user.uid).collection('salvataggi').add({
      'fonte': widget.single.fonte,
      'title': widget.single.title,
      'url': widget.single.urlAvv,
      'imageEv': widget.single.imageEvAvv,
      'lastupdate': widget.single.dataAggiornamento,
      'p1': widget.single.iconaProspettiva1,
      'p1url': widget.single.urlProspettiva1,
      
    }).then(docRef=>await _usersRef.doc(_user.uid).collection('salvataggi').doc(docRef.id).update({'id':docRef.id}));
  }

推荐阅读