当前位置: 首页 > 知识库问答 >
问题:

尝试从firestore中的子集合调用文档id

李耀
2023-03-14

我试图运行一个删除函数,它应该是相当直接的,但我没有得到它。

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

我将文档信息存储在一个数组中,但我需要在数组中循环查找与帖子匹配的id。一旦存储了引用,我就很难从get答案中抓取引用。

代码如下:

    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的应答文档。以下是数据库的屏幕截图:

共有2个答案

苏承载
2023-03-14

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

getAnswer.id在这种情况下是没有意义的,它完全不清楚什么useraskIdid甚至在您显示的上下文中。

您正在处理什么事件?您如何知道事件指示的答案?是按钮吗?选择复选框?单选按钮?

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

我使用FirebaseFirestore的包装包,它总是在我的记录对象中包含doc.ref.path作为refPath,正是出于这个原因,您还可以解析它来查找父文档,等等

步嘉德
2023-03-14

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

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

或者:

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

或者(没有回答DocumentRef):

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

或者:

db.doc(`questions/${questionId}/answer/${answerId}`).delete();
 类似资料:
  • 在我的集合的SnapshotListener中,我使用以下命令循环遍历文档: 在 for 循环中的每个文档中,让我们称之为 ,我在 Cloud Firestore 上还有另一个文档集合。我想检索内子集合中的所有文档(每个文档只有一个字符串字段)。我能够做一个来获取本身,我用它来获取字符串字段,但我不知道如何获取其子集合中的文档。

  • 我如何删除一个特定的文档中的一个集合在fiRecovery使用反应? 我在这里和谷歌上看了看,但我没有发现任何内在相关的东西。 我只是设法从我的集合中删除索引[0]的文档。 这状态idDoc接收所有id文档。 如果我只是传递. doc(idDoc),我会得到以下错误: Firebase Error: Function Collection Reference.doc()要求它的第一个参数是非空字符

  • 我的FiRecovery数据库中有一个名为Reports的集合,我已经在其中添加了文档。但我现在的问题是我想在报表中添加一个带有子集合的文档,有什么想法吗?

  • 我正在使用Java开发一个Android应用程序,我使用firestore数据库,我有一个名为用户位置的集合,其结构类似于照片: 分贝 我的问题是,当一个用户改变他的位置或一个新用户进入一个已经存在的位置(其他用户有相同的位置)时,它会创建一个新文档(如在“oran, algerie”中)。当我添加新用户并更新文档时,我想使用,但问题是我无法以正常方式检索根集合的所有文档: 它返回null。我尝试

  • 据我所知,我可以使用云函数以某种方式实现这一点?我试着阅读云函数,但我很迷路。是否有一种方法可以触发云函数,在用户更新帖子时删除子集合中的所有文档?

  • 为了查询子集合和父文档,我对firest的文档及其最佳实践有一些问题。我试图使用Typecript在我的Firebase函数中进行查询。 DB: ├── 用户(集合) │ └── 用户(ID为的文档) │ │ └── 计划(子集合) 我有一个数组中的用户ID列表,我需要从用户文档和当前文档的子集合计划中收集信息。 但是如何从用户文档和子集合(计划)文档(当前)中获取数据,我不知道在场景中最有效的查