Как получить коллекцию внутри документа на Firestore? - PullRequest
0 голосов
/ 22 марта 2020

У меня есть коллекция с именем users, внутри каждого пользователя документа есть коллекция с именем monthlies, и я хочу ее получить. Это структура:

enter image description here

В настоящее время я пытался получить его, используя:

var getUsers = async function() {
        var db = firebase.firestore()
        var users = await firebase
            .firestore()
            .collection("users")
            .get();
        return users
}

var getMonthlyByUserId = async function () {
    var users = await getUsers()
    users.forEach(element => {
        var monthlies = element.collection('monthlies').get()
        console.log(monthlies.docs.map(doc => doc.data()))
    })
}

Но он ничего не печатает. Целью является повторение ежемесячных сборников всех документов.

Ответы [ 2 ]

1 голос
/ 22 марта 2020

В дополнение к проблеме, на которую указал Дуг (необходимо использовать свойство ref QueryDocumentSnapshot), необходимо учитывать, что метод get() является асинхронным.

Таким образом,

users.forEach(snapshot => {
    var monthlies = snapshot.ref.collection('monthlies').get()
    console.log(monthlies.docs.map(doc => doc.data()))
})

не будет работать.

Если вы не можете использовать запрос группы сбора (например, давайте представим, что ваша функция getUsers() возвращает только подмножество всех пользователей, например, всех пользователей данной страны), вы можете использовать Promise.all() следующим образом:

var getMonthlyByUserId = async function () {
    const users = await getUsers();
    const promises = [];
    users.forEach(snapshot => {
      promises.push(snapshot.ref.collection('monthlies').get());
    });
    const monthlies = await Promise.all(promises);
    monthlies.forEach(snapshotArray => {
      console.log(snapshotArray.docs.map(doc => doc.data()));
    });
 }

ИЛИ вы можете использовать эту технику описанный в этой статье о том, как использовать async / await внутри forEach().

0 голосов
/ 22 марта 2020

В вашем коде element является объектом QueryDocumentSnapshot типа. У него нет метода с именем collection(), поэтому я ожидаю, что ваш код обработает sh с ошибкой в ​​журнале.

Если вы хотите сослаться на подколлекцию, организованную в документе, представленном QueryDocumentSnapshot вы должны использовать его свойство ref :

users.forEach(snapshot => {
    var monthlies = snapshot.ref.collection('monthlies').get()
    console.log(monthlies.docs.map(doc => doc.data()))
})

В качестве альтернативы, если вы просто хотите запрашивать все документы во всех подколлекциях, называемых "ежемесячными", вы можете упростить это с помощью одного запрос группы сбора .

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