REACT JS — Firestore: Как проверить документы, чтобы проверить существующие документы и избежать дублирования документов

# #reactjs #firebase #loops #google-cloud-firestore

Вопрос:

Я пытаюсь проверить, есть ли у меня уже добавленная книга с таким же названием и классом (курс) Я не уверен на 100%, работает ли amp;amp; как И в REACT, но я думаю, что это действительно так, потому что в любом случае в коде не было никаких жалоб, переходящих к проблеме:

 const register = (e) => {
        e.preventDefault();
        const docRef = db.collection('libros').doc();

        docRef.get().then((doc) => {

            if (doc.id.descripcion == descripcion amp;amp; doc.id.grado == grado) 
            {
                window.alert("Book exist already")
            }
            else {

                docRef.set({
                    materia: materia,
                    descripcion: descripcion,
                    editorial: editorial,
                    grado: grado,
                    precio: precio,
                    id: docRef.id

            }).then((r) => {
                window.alert("Book added")
            })}
    })
}
 

Это код снипа, в котором у меня возникла проблема, моя идея состоит в том, чтобы просмотреть все документы, которые у меня есть в этой коллекции, я не уверен, правильно ли я это пишу (явно не потому, что это не работает).

Идея состоит в том, что в документах есть поле под названием Описание и курс (descripcion и градация), и я хочу сначала сравнить документы, чтобы проверить, имеют ли они одинаковое описание и курс, например, они могут иметь одинаковое описание, но не один и тот же класс или один и тот же класс, но не одно и то же описание

(что, я думаю, я правильно понимаю эту логику) : doc.id.descripcion == descripcion amp;amp; doc.id.grado == grado

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

Правка: Забыл добавить, как это выглядит в firebase и вводе введите описание изображения здесь

Ответ №1:

Это никогда не найдет никаких дубликатов:

 const docRef = db.collection('libros').doc();

docRef.get().then((doc) => {
    if (doc.id.descripcion == descripcion amp;amp; doc.id.grado == grado) {
        window.alert("Book exist already")
    }
    ...
 

Причина этого в том, что в первой строке создается ссылка на новый документ. Затем следующая строка пытается загрузить этот документ, который никогда не даст вам никаких данных.

doc.id.descripcion И также doc.id.grado неверны, и, вероятно, должны быть doc.data().descripcion и. doc.data().grado Но это не имеет большого значения, так как вы все равно никогда не получите документ get() , так как вы пытаетесь загрузить документ из ссылки, которую вы только что создали и никогда не писали.


Чтобы убедиться, что в Firestore есть что-то уникальное, используйте его в качестве идентификатора документов. Поэтому, если вы хотите, чтобы название книги и оценка были уникальными, создайте идентификатор документа из названия книги и оценки, вместо того чтобы просить Firestore сгенерировать для вас уникальный идентификатор:»

 const docId = descripcion   grado;
const docRef = db.collection('libros').doc(docId);

docRef.get().then((doc) => {
    if (doc.exists) {
        window.alert("Book exist already")
    }
    ...
 

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

1. Быстрый вопрос № 1! Почему работает ? Быстрый вопрос № 2! Итак, если бы я не использовал другую переменную в этом случае docId, сработало бы это также ? doc.data().descripcion == descripcion amp;amp; doc.data().descripcion == grado

2. #1) Мы просто объединяем строки там. Поэтому мы создаем идентификатор документа, комбинируя два значения, которые вы хотите сделать уникальными. #2 Я не совсем понимаю, что вы имеете в виду. В моем коде эта проверка больше не нужна, так как мы уже используем значения в идентификаторе документа, поэтому, если doc.exists документ с таким именем и оценкой уже существует.

3. #2 Я знаю, что это больше не нужно, но просто хотел знать, сработает ли это в любом случае

4. Если вы также хотите проверить значения в данных документа, вы можете сделать это с doc.data() помощью , так doc.data().descripcion и doc.data().grado .

5. Если вы хотите отфильтровать книги, которые считываются из базы данных (вместо обеспечения уникальности), вы бы использовали запрос