Как я могу получить документы внутри вложенной коллекции в каждом документе в Firebase Firestore?

#javascript #html #firebase #google-cloud-firestore

#javascript #HTML #firebase #google-cloud-firestore

Вопрос:

Как я могу получить все документы внутри вложенной коллекции «userPosts» в Firebase Firestore с помощью JavaScript? Вы можете увидеть структуру моей базы данных на рисунках ниже.

Вот что я пробовал:

 firebase.auth().onAuthStateChanged(function(user) {

    var postRef = database.collection('posts').doc().collection('userPosts');

    postRef.get().then(snapshot => {
        setupPosts(snapshot.docs)
    })

    const posts = document.querySelector('.posts');

    const setupPosts = (data) => {

        let html = '';
        data.forEach(doc => {
            const post = doc.data();

            console.log(post)

            const li = `
            <li>
                <div class="title">${post.title}</div>
                <div class="content">${post.content}</div>
            </li>
            `;
            html  = li
        })

        posts.innerHTML = html;

    }
})
  

Что должен сделать этот код, так это получить документы из вложенной коллекции «userPosts». И он должен входить в каждый документ в коллекции «posts», а затем переходить в «userPosts» и получать каждый документ в этой вложенной коллекции.

Первая коллекция «сообщения»

Вложенная коллекция «Сообщения пользователей»

Комментарии:

1. Я не уверен, что понимаю. Можете ли вы показать, что вы уже пробовали, или почему код из этой документации у вас не работает? firebase.google.com/docs/firestore/query-data /…

2. Теперь я добавил код, который я пробовал!

Ответ №1:

Похоже, вам нужен запрос группы коллекций. Это даст вам все документы во всех вложенных коллекциях с именем «userPosts»:

 const query = database.collectionGroup("userPosts")
query.get().then(querySnapshot => { ... })
  

Комментарии:

1. Я часами боролся с вложенными обещаниями и циклами (не работает), это спасло мне день!

Ответ №2:

Эта строка не имеет смысла:

 var postRef = database.collection('posts').doc().collection('userPosts');
  

database.collection('posts').doc() Создается ссылка на новый, несуществующий документ в posts коллекции. Поскольку вы затем создаете его userPosts вложенную коллекцию, это, конечно, не будет существовать / быть пустым.


Если вы хотите получить userPosts вложенную коллекцию для своего user аргумента, и вы сохраняете пользователей на основе их UID, тогда это будет:

 var postRef = database.collection('posts').doc(user.uid).collection('userPosts');
  

Комментарии:

1. Но я не хочу получать конкретный документ с идентификатором UID в качестве идентификатора docID, я хочу получить каждый документ, а затем перейти в вложенную коллекцию, если вы понимаете.