Javascript Firebase-访问集合中的集合数据返回o.indexOf错误
我目前拥有从集合中存储的文档中检索firestore数据并将其呈现给客户端的功能,但是我还需要从父文档中的集合中检索文档中的数据并呈现此数据。我知道firestore以分层方式存储数据,但我得到了以下错误: 未处理的承诺拒绝:TypeError:o.indexOf不是函数。(在“o.indexOf”(“/”)中,“o.indexOf”未定义) 从以下代码:Javascript Firebase-访问集合中的集合数据返回o.indexOf错误,javascript,firebase,google-cloud-firestore,Javascript,Firebase,Google Cloud Firestore,我目前拥有从集合中存储的文档中检索firestore数据并将其呈现给客户端的功能,但是我还需要从父文档中的集合中检索文档中的数据并呈现此数据。我知道firestore以分层方式存储数据,但我得到了以下错误: 未处理的承诺拒绝:TypeError:o.indexOf不是函数。(在“o.indexOf”(“/”)中,“o.indexOf”未定义) 从以下代码: db.collection('tickets').get().then(snapshot => { snapshot.docs.
db.collection('tickets').get().then(snapshot => {
snapshot.docs.forEach(doc => {
renderTickets(doc);
db.collection('tickets').doc(doc).collection('comments').get().then(snapshot => {
snapshot.docs.forEach(doc => {
renderComments(doc);
});
});
});
});
在此之前,我只有以下功能可以访问非嵌套文档,这很好:
db.collection('tickets').get().then(snapshot => {
snapshot.docs.forEach(doc => {
renderTickets(doc);
});
});
My renderComments()/renderTickets()函数(它们都是相同的):
我需要在关联票据下呈现注释,并且我不希望通过硬编码名称来访问每个文档/嵌套文档,这就是为什么我在父文档中时尝试访问嵌套文档的原因。知道我哪里出错了吗?谢谢。您正在将一个文档引用传递给tickets collection引用的
doc
方法,该方法需要一个字符串。您不需要从tickets集合“重新开始”,因为您已经有了单个ticket的文档引用,所以您应该能够执行以下操作:
db.collection('tickets').get()。然后(快照=>{
snapshot.docs.forEach(doc=>{
效果图(doc);
doc.ref.collection('comments').get()。然后(快照=>{
snapshot.docs.forEach(doc=>{
渲染文件(doc);
});
});
});
});
我理解为什么会这样,但不幸的是,它返回了以下错误:未处理的承诺拒绝:TypeError:doc.collection不是一个函数。(在“doc.collection('comments')”中,“doc.collection”未定义)
@Jamie my bad!更新的答案应该适合您(注意doc.ref.collection('comments')
而不是doc.collection('comments')
)snapshot.docs
是QueryDocumentSnapshot()的数组。要获取子集合,您需要一个DocumentReference(),它是通过doc.ref
获得的。有道理吗?是的,伙计,谢谢你的帮助!不客气:)
function renderComments(doc) {
let li = document.createElement('li');
let comment = document.createElement('p');
let name = document.createElement('p');
let timestamp = document.createElement('p');
li.setAttribute('data-id', doc.docId);
comment.textContent = "Description: " + doc.data().comment;
name.textContent = "Type: " + doc.data().name;
timestamp.textContent = "Priority: " + doc.data().timestamp;
li.appendChild(comment);
li.appendChild(name);
li.appendChild(timestamp);
}