«documentRef» — это недопустимая ссылка на документ, показывающая

# #javascript #firebase #google-cloud-firestore

#язык JavaScript #огневая база #google-облако-firestore

Вопрос:

 async function process_tasks() {  let campaignsRef = db.collection('campaigns')  let activeRef = await campaignsRef.where('active', '==', true).select().get();  for (campaign of activeRef.docs) {  console.log(campaign.id);  (CHOICE 1) let tasksRef = await campaignsRef.doc(campaign.id).collection('tasks').get();  (CHOICE 2) let tasksRef = await campaign.collection('tasks').get();  for(task of tasksRef.docs) {  console.log(task.id, task.data())  }   } }  

Когда я использую (ВЫБОР 2) , «Ссылка на документ» не является допустимым отображением ОШИБКИ ссылки на документ.
В моем коде нет переменной с именем documentRef( в качестве примечания для тех, кто ошибочно так думает).

Интересно, почему? не должно campaign быть равно campaignsRef.doc(campaign.id) ?

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

1. В вашем коде нет переменной documentRef (как указано в ошибке). Вы уверены, что ошибка исходит из этого кода?

2. Где находится переменная documentRef ? Можете ли вы опубликовать всю ошибку целиком?

3. Как я понимаю campaign , это documentRef . Я думаю, что вы не можете использовать .collection на documentRef А. @ФранкванПуффелен

4. В сообщении об ошибке говорится, что есть переменная с именем documentRef , которая, как ожидается, будет иметь тип DocumentReference . В коде нет переменной с именем documentRef , отсюда мой вопрос.

5. @FrankvanPuffelen Могу ли я знать, почему вы думаете, что в моем коде есть переменная с именем documentRef?

Ответ №1:

Все, что вы написали на вторых выборах, верно, за исключением одной вещи. Переменная (кампания), созданная в цикле for, называется DocumentSnapshot. Вы должны использовать .ref для доступа ссылку из DocumentSnapshot.

 async function process_tasks() {  let campaignsRef = db.collection('campaigns')  let activeRef = await campaignsRef.where('active', '==', true).select().get();  for (campaign of activeRef.docs) {  //campaign is DocumentSnapshot  console.log(campaign.id);  (CHOICE 1) let tasksRef = await campaignsRef.doc(campaign.id).collection('tasks').get();  (CHOICE 2) let tasksRef = await campaign.ref.collection('tasks').get(); // add .ref after campaign  for(task of tasksRef.docs) {  console.log(task.id, task.data())  }   } }  

Спасибо.

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

1. так campaign же как и снимок документа, который является . documentref Мы должны в дальнейшем использовать .ref , чтобы получить DocumentReference ?

2. совершенно правильно, вы должны использовать .ref, чтобы получить ссылку на документ из DocumentSnapshot. пример: var documentSnapshot = db.коллекция(«кампания»). doc(…).get(); var DocumentReference = documentSnapshot.ref;

3. вы герои в stackoverflow…… Это задокументировано? Я просто не смог найти в документации firestore…