# #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
Но, похоже, он даже не просматривает этот код, любые советы приветствуются, и, насколько я понимаю, предполагается циклически проверять и проверять каждый документ.
Ответ №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. Если вы хотите отфильтровать книги, которые считываются из базы данных (вместо обеспечения уникальности), вы бы использовали запрос