尝试从 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
索引。它是一个对象数组,每个对象都有属性id
和answers
,按照查询按时间戳返回文档的顺序。
getAnswer.id
在这种情况下是没有意义的,在你显示的情况下,甚至完全不清楚 user
、questionId
和 id
是什么。
您正在处理什么事件?你怎么知道事件表明了哪个答案?它是一个按钮吗?选择?复选框?单选按钮?
另请注意:QuerySnapshot INCLUDES doc.ref.path 中的每个 DocumentSnapshot,您可以直接将其传递给 db.doc(refPath).delete()
- 无需构造 .collection().doc().collection()
等。
出于这个原因,我为 FirebaseFirestore 使用了一个包装器包,它始终在我的 Record 对象中包含 doc.ref.path
作为 refPath - 此外,您可以解析它以查找父文档等
【讨论】:
如果有帮助,请在帖子中添加更多信息以上是关于尝试从 Firestore 中的子集合调用文档 ID的主要内容,如果未能解决你的问题,请参考以下文章