尝试从 Firestore 中的子集合调用文档 ID

Posted

技术标签:

【中文标题】尝试从 Firestore 中的子集合调用文档 ID【英文标题】:Trying to call a document id from a sub-collection in firestore 【发布时间】:2021-09-02 07:52:47 【问题描述】:

我正在尝试运行一个应该相当直接的删除功能,但我没有得到它。

我在子集合中引用了该文档,但它似乎没有被正确引用。当我对答案文档 id 进行硬编码时,它会执行该功能,但是当我尝试引用它时它不起作用。

我将文档信息存储在一个数组中,但我需要在数组中循环查找与帖子匹配的 id。存储后,我无法从“getAnswer”获取引用。

代码如下:

    const [getAnswer, setGetAnswer] = useState([]);

    useEffect(() => 
    let mounted = true;

    db.collection("questions")
      .doc(questionId)
      .collection("answer")
      .orderBy("timestamp", "desc")
      .onSnapshot((snapshot) => 
        if (mounted) 
          setGetAnswer(
            snapshot.docs.map((doc) => (
              id: doc.id,
              answers: doc.data(),
            ))
          );
        
      );

    return () => (mounted = false);
  , []);

  const handleDeletePost = (e) => 
    if (user) 
      db.collection("questions")
        .doc(questionId)
        .collection("answer")
        .doc(getAnswer.id)
        .delete();
    
  ;

  const answerMenuId = "primary-answer-account-menu";
  const answerRenderMenu = (
    <Menu
      anchorEl=anchorEl
      anchorOrigin= vertical: "top", horizontal: "right" 
      id=answerMenuId
      keepMounted
      transformOrigin= vertical: "top", horizontal: "right" 
      open=isMenuOpen
      onClose=handleMenuClose
    >
      <MenuItem onClick=handleMenuClose>Edit</MenuItem>
      <MenuItem onClick=handleMenuClose onClick=handleDeletePost>
        Delete
      </MenuItem>
    </Menu>
  );

对于更多上下文,我想根据文档的 id 删除答案文档。这是数据库的截图:

【问题讨论】:

当您从数据库中获取数据时,您可以将问题 ID 和答案 ID 存储为该元素的键,例如 quesID-ansID。这样你就有了两者,当你点击它时,你可以很容易地得到它,就像提到的here。然后只需使用- 拆分它们并将它们传递给删除函数? 我不确定我是否理解:您要删除哪个答案?还是您要删除特定问题的所有答案? 我正在尝试删除特定问题的一个答案 【参考方案1】:

假设answerId 是一个保存要删除的答案的文档 ID 的变量,您正在寻找:

const answersDocumentRef = db.doc("answer/"+answerId);

或者:

const answersDocumentRef = db.doc(`answer/$answerId`);

或者(没有answersDocumentRef):

db.collection("questions")
    .doc(questionId)
    .collection("answer")
    .doc(answerId)
    .delete();

或者为此:

db.doc(`questions/$questionId/answer/$answerId`).delete();

【讨论】:

我遇到的问题是 answerId 不是变量,我似乎无法存储它。当我尝试通过 doc.id 存储它时,我得到父集合 id 而不是答案的 我不明白你的意思。您能否编辑您的问题以在 Firestore 控制台中显示您尝试删除的文档的屏幕截图? 好的,在帖子中添加了更多信息【参考方案2】:

您的getAnswer 是一个数组,它没有被id 索引。它是一个对象数组,每个对象都有属性idanswers,按照查询按时间戳返回文档的顺序。

getAnswer.id 在这种情况下是没有意义的,在你显示的情况下,甚至完全不清楚 userquestionIdid 是什么。

您正在处理什么事件?你怎么知道事件表明了哪个答案?它是一个按钮吗?选择?复选框?单选按钮?

另请注意:QuerySnapshot INCLUDES doc.ref.path 中的每个 DocumentSnapshot,您可以直接将其传递给 db.doc(refPath).delete() - 无需构造 .collection().doc().collection() 等。

出于这个原因,我为 FirebaseFirestore 使用了一个包装器包,它始终在我的 Record 对象中包含 doc.ref.path 作为 refPath - 此外,您可以解析它以查找父文档等

【讨论】:

如果有帮助,请在帖子中添加更多信息

以上是关于尝试从 Firestore 中的子集合调用文档 ID的主要内容,如果未能解决你的问题,请参考以下文章

Firestore 查询文档的子集合

来自特定文档 Firestore 安全性的通配符子集合

Firestore中的子集合在基本文档上可见吗?

从Firebase的Cloud Firestore删除文档是否会删除该文档中的所有子集合?

Firebase Firestore 子集合

有没有办法获取子集合中的所有文档(Firestore)