В вашем массиве вы храните DocumentReferences
.Если вы хотите получить данные соответствующих документов, чтобы включить эти данные в ваш объект, вы должны использовать Promise.all()
для выполнения переменного числа (1 или более) из get()
асинхронных операций.
Должно работать следующее (не проверено совсем):
app.get("/campgrounds/:docId", function(req, res) {
var docRef = firestore.collection("campgrounds").doc(req.params.docId);
try {
var campground = {};
docRef.get()
.then(doc => {
if (!doc.exists) {
res.send("no such document");
} else {
campground = {
doc: doc.data(),
title: doc.data().title,
id: req.params.docId
};
var promises = [];
doc.data().comments.forEach((element, index) => {
promises.push(firestore.doc(element).get());
});
return Promise.all(promises);
}
})
.then(results => {
var comments = {};
results.forEach((element, index) => {
comments[index] = element.data().title //Let's imagine a comment has a title property
});
campground.comments = comments;
res.render("campground", campground);
})
} catch (error) {
res.send(error);
}
});
Обратите внимание, что с этим кодом вы выполняете 1 + N запросов (N - длина массива comments
).Вы можете денормализовать ваши данные и напрямую сохранить в документе campground
данные comments
: тогда вам потребуется только один запрос.