Заполните документ облачного пожарного хранилища, содержащий массив ссылок на документы - PullRequest
0 голосов
/ 07 декабря 2018

У меня есть коллекция с именем 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 голосов
/ 07 декабря 2018

В вашем массиве вы храните 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: тогда вам потребуется только один запрос.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...