Firestore – могу ли я запросить один документ с параметром, отличным от идентификатора?

Я пришел из MongoDB и изо всех сил пытаюсь понять getDoc() и getDocs().

Я правильно это понимаю?

Принимает ли getDoc() в качестве параметра только идентификатор документа? Или я могу сделать запрос?

В документации я могу найти только такой код:

const docRef = doc(db, "collection", "11aa22bb33ccc");
const myDoc = await getDoc(docRef);

Но что, если я не знаю идентификатор или хочу выполнить поиск по другому параметру, например по полю author? Правильно ли, что я не смогу сделать это с getDoc()?

С MongoDB я могу db.collection.findOne({ author: "jones" }).

Могу ли я не сделать это с Firestore?

Итак, если я хочу использовать запрос, всегда ли мне нужно использовать getDocs()?

Если это так, я знаю, что могу использовать limit(1), но обработка ответа для получения этого одного документа кажется не такой гладкой, как в mongodb.

Я попробовал это:

const documents = collection(firebaseDb, 'documents');
const query = query(documents, where('author', '==', 'jones'));
const authorDocs = await getDocs(query, limit(1));
console.info(authorDocs[0].data());

И у меня появилась ошибка: Cannot read properties of undefined (reading 'data')

Поэтому я думаю, что мне нужно использовать forEach, вот так:

authorDocs.forEach(doc => console.info( doc.data() ));

Но только для одного документа? Это кажется странным. Есть ли способ лучше?

Взгляните на эту Документацию.

Sandeep Vokkareni 04.08.2024 10:58

привет @SandeepVokkareni, спасибо за ответ, однако это та же самая документация, которую я просматривал. Там, где написано docRef = doc(db, "cities", "SF"), SF — это идентификатор документа, верно?

bprdev 04.08.2024 18:17
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
0
2
63
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Принимает ли getDoc() только идентификатор документа в качестве параметра?

Нет, getDoc() требует аргумента типа «ссылка на документ», указывающего на документ, существующий в коллекции Firestore.

Но что, если я не знаю идентификатор или хочу выполнить поиск по другому параметру, например по полю «автор»?

Тогда вам действительно нужно использовать запрос, который выглядит следующим образом:

const queryByAuthor = query(collection(db, "documents"), where("author", "= = ", "jones"));

Правильно ли, что я не смогу сделать это с помощью getDoc()?

Да, getDoc() используется для чтения одного документа, а не нескольких документов, возвращаемых запросом. Если вы хотите прочитать все документы, вам действительно нужно использовать getDocs() и перебирать результаты:

const querySnapshot = await getDocs(queryByAuthor);
querySnapshot.forEach((doc) => {
  // doc.data() is never undefined for query doc snapshots
  console.info(doc.id, " => ", doc.data());
});

Если вы хотите прочитать только первый документ, вам следует прочитать документ с индексом 0, querySnapshot[0]:

const querySnapshot = await getDocs(queryByAuthor);
if (querySnapshot.docs.length > 0) {
  const doc = querySnapshot.docs[0];
  console.info('Document data:', doc.data());
}

Кроме того, всегда старайтесь не использовать неопределенные объекты для создания ссылок или запросов Firestore.

вы ответили no на мой вопрос о getDoc() принятии только удостоверения личности. Но в документации есть такой пример docRef = doc(db, "cities", "SF"). SF это идентификатор документа, верно?

bprdev 04.08.2024 18:25

Я сказал нет, в вашем контексте, где вы используете ссылку на документ. Но действительно getDoc() может принять в качестве аргумента идентификатор документа.

Alex Mamo 05.08.2024 07:38

ок, спасибо за разъяснения. Могу ли я получить немного больше разъяснений, пожалуйста. И getDoc() не может принять запрос в качестве аргумента, верно? Только идентификатор документа? Вы сказали, что он «может принять...», так что я просто проверяю дважды. Спасибо.

bprdev 05.08.2024 08:39

Да, getDoc() не может принять запрос в качестве аргумента, только getDocs() может.

Alex Mamo 05.08.2024 08:50

Алекс, еще один вопрос. Я заметил, что вы использовали .docs[0], попробовал, и это сработало. Почему мы можем запустить forEach() с помощью querySnapshot, но это не работает: querySnapshot[0]?

bprdev 05.08.2024 23:27

forEach уже существует в первом фрагменте кода. Вам нужно запросить querySnapshot не первый документ внутри результата, верно?

Alex Mamo 07.08.2024 07:49

Другие вопросы по теме