Запрашивайте документы в firestore из массива идентификаторов

# #javascript #firebase #google-cloud-firestore #nosql

Вопрос:

Мне было интересно, как я могу запрашивать документы из коллекции firestore из массива идентификаторов? Мне нужны только документы в коллекции, которые находятся в массиве идентификаторов. Я посмотрел на другой ответ и думаю, что мой подход верен, однако я получаю ошибку.

 (node:15105) UnhandledPromiseRejectionWarning: TypeError: Cannot read property 'data' of undefined
>      at /Users/username/SideProjects/projectname/functions/index.js:40:38
>      at processTicksAndRejections (internal/process/task_queues.js:95:5)

 

Ошибка возникает из-за того, что функция не находит никаких документов в коллекции из этого массива идентификаторов. Тем не менее, я дважды проверил базу данных и знаю, что в коллекции есть документы с идентификаторами из массива.

 const admin = require('firebase-admin')

....

let feedItems = db.collection(feedItemsCollection)

feedItemsList = feedItems.where(admin.firestore.FieldPath.documentId(), 'in', ['HPOorsSnbHpTYwwXxfWw']).get().then(snapshot2 => {
       console.log(admin.firestore.FieldPath.documentId())
       console.log("In feed Items")
       //console.log(feedItemIds)
       console.log(snapshot2[0])

       //error happens on this line because snapshot2[0] returns undefined
       console.log(snapshot2[0].data())
})
 

Snapshot2[0] возвращает неопределенное, что, как я предполагаю, означает, что данные не возвращались. Я думаю, что неправильно вызываю documentId (), но не знаю исправления.

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

1. snapshot2 не является массивом, поэтому вы не можете индексировать его таким образом.

Ответ №1:

Там «может быть» две проблемы с вашим кодом. Следуйте обоим пунктам, чтобы убедиться, что все работает

  1. Данные внутри snapshot2 , возможно empty

Сначала вам нужно будет исправить свой код, чтобы проверить эту теорию. Вы неправильно получаете доступ к данным snapshot2 . Чтобы сделать это правильно, один из способов заключается в следующем:

 // `snapshot2` will have a `docs` property that you can leverage
const snapshot2Data = snapshot2.docs.map((doc) => doc.data());
 
  1. .documentId() возможно, он делает не то, что должен (как вы сказали)

Чтобы проверить эту теорию, проверьте snapshot2Data , пуста ли она. Бежать :

 console.log(snapshot2Data); // what do you get ?
 

Если нет, он не пуст и вы получили данные обратно, то все готово. Больше делать нечего

Если да, он пуст, то запустите :

 console.log(admin.firestore.FieldPath.documentId()); // what do you get ?
 

Ты получил ответ string «а»? Если нет, то у нас есть еще одна проблема. Вам также нужно будет более внимательно изучить вашу firebase-admin настройку.