Как получить и сохранить оба doc.id в документе в Firebase Firestore?

#javascript #firebase #google-cloud-firestore

#javascript #firebase #google-облако-firestore

Вопрос:

Я хочу сохранить оба doc.ids в расположении документа ниже, чтобы я мог повторно использовать их для последующего доступа к документу. Как я могу найти и сохранить каждый из них в переменной?

Например: я должен прочитать этот документ в функции позже в коде, поэтому я сохраню оба doc.id. Вот путь к документу : db.collection('posts').doc(uid).collection('userPosts').doc(random id generated by Firebase) . Как я могу сохранить uid и «случайный идентификатор» в двух разных переменных?

Вот фрагмент кода, который считывает каждый документ внутри вложенной коллекции и представляет его в HTML как li. Итак, каждый li является документом, и мне нужны два doc.id из каждого li:

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

    var query = db.collectionGroup("userPosts")

    query.get().then(querySnapshot => {
        setupPosts(querySnapshot.docs)
    })

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

const setupPosts = (data) => {
    let html = '';
    data.forEach(doc => {
        var docRefIDpost = docRef.id
        const post = doc.data();
        const picURL = post.picURL;
        let li = `<li class="post">
            <div class="title">${post.title}</div>
            <div class="content">${post.content}</div>
            <button class="comment" onclick="comment('${docRefIDpost}')">Comment</button>
            <button class="like" onclick="like('${docRefIDpost}')">Like</button>`;
        
        li  = (post.picURL ? `<img class="img" src="${post.picURL}" onclick="openImage('${picURL}')">` : ``);
        li  = `</li><br></br>`;
        html  = li
    })
    
    posts.innerHTML = html;
}

  

Дополнительная информация:

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

База данных

Здесь также есть функция комментариев:

 function comment(docRefIDpost) {

    var modalcomment = document.getElementById("modal-comment");

    modalcomment.style.display = "block";

    var submitcomment = document.getElementById("submitcomment");

    submitcomment.addEventListener('click', (e) => {

        var commentinput = document.getElementById("comment");

        console.log(docRefIDpost)

        db.collection('posts').doc(docRefIDpost).collection('userPosts').doc(docRefIDpost).collection('comments').add({

            comment: commentinput.value,

        })

    })

}
  

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

1. Разве это уже не хранит идентификатор документа? var docRefIDpost = docRef.id

2. Он сохраняет первый из них, но не второй

3. Фрэнк, ты знаешь, как сохранить оба doc.id? Потому что var docRefIDpost …. хранит только первый (uid), а не идентификатор документа во вложенной коллекции userPosts .

Ответ №1:

Чтобы также иметь идентификатор документа userPosts в вашем HTML, вы получите их из doc :

 const setupPosts = (data) => {
    let html = '';
    data.forEach(doc => {
        const docRefIDPost = doc.id;
        const post = doc.data();
        const picURL = post.picURL;
        let li = `<li class="post">
            <div class="title">${post.title}</div>
            <div class="content">${post.content}</div>
            <button class="comment" onclick="comment('${docRefIDpost}')">Comment</button>
            <button class="like" onclick="like('${docRefIDpost}')">Like</button>`;
        
        li  = (post.picURL ? `<img class="img" src="${post.picURL}" onclick="openImage('${picURL}')">` : ``);
        li  = `</li><br></br>`;
        html  = li
    })
    
    posts.innerHTML = html;
}
  

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

1. Теперь он использует только последний doc.id . Код создает новый документ с новой вложенной коллекцией «userPosts», а затем создает новый пустой документ и делает комментарии внутри этого пустого документа. Он не использует существующий документ.

2. У каждого <button class="comment" onclick="comment('${docRefIDpost}')"> должен быть идентификатор записи, для которой он предназначен. Разве это не то, что вы видите? Если нет, можете ли вы настроить воспроизведение на сайте, таком как jsbin / stackblitz, чтобы мы все смотрели на одно и то же?

3. Ни jsbin, ни stackblitz не работали. Может быть, это только я что-то не так делал, но я добавил немного новой информации. Надеюсь, это поможет