填充包含一系列文档引用的云Firestore文档

时间:2018-12-07 08:28:05

标签: firebase express google-cloud-firestore

我有一个名为campgrounds的集合,其中每个文档都包含一个指向注释集合中文档的文档引用数组。 看起来像这样Campground

我正在尝试找到一种方法,以在将其发送到我的ejs模板之前填充此注释数组。

我的代码如下

app.get("/campgrounds/:docId", function(req, res) {
    var docRef = firestore.collection("campgrounds").doc(req.params.docId);

    try {
        docRef.get().then(doc => {
            if (!doc.exists) {
                res.send("no such document");
            } else {
                // res.send(doc.data());
                res.render("campground", {
                    doc: doc.data(),
                    title: doc.data().title,
                    id: req.params.docId
                });
            }
        });
    } catch (error) {
        res.send(error);
    }
});

1 个答案:

答案 0 :(得分:0)

在数组中存储DocumentReferences。如果要获取相应文档的数据以便将该数据包含在对象中,则应使用Promise.all()执行get()异步操作的变量号(1个或更多)。

以下内容应该可以工作(但是完全未经测试):

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文档中:然后只需要一个查询。