Firestore : получить все файлы ( указать только идентификаторы)

# #javascript #firebase #react-native #google-cloud-firestore

Вопрос:

Мне нужно получить весь файл с указанным идентификатором

мой магазин ( структура )

 users/user1/img1 -> [ fileId = img1  , file = img1.jpg ]
users/user2/img2 -> [ fileId = img2  , file = img2.jpg ]
users/user3/img3 -> [ fileId = img3  , file = img3.jpg ]
 

Я нахожу в документе методы «GetAll» ( https://googleapis.dev/nodejs/firestore/latest/Firestore_.html#getAll )

но с их примером это не работает.

Мой код

 import storage  from "@react-native-firebase/storage";

let docRef1 = storage().doc('/users/user1/img1');
let docRef2 = storage().doc('/users/user2/img2');
return new Promise((resolve, reject) => {
    // Now we get the references of these images
    storage().getAll(docRef1, docRef2).then(docs => {
        resolve()
    }).catch(function(error) {
        // Handle any errors
        console.log('error', error)
        reject()
    });
 

Моя ошибка:

 TypeError: (0, _storage.default)().doc is not a function. (In '(0, _storage.default)().doc('/products/3799569030005-1.jpg')', '(0, _storage.default)().doc' is undefined)
 

Обновление 1: после поста Фрэнка ван Пуффелена
Я изменяю свой код для тестирования с помощью идентификатора

 import firestore from "@react-native-firebase/firestore";
let docRef1 = firestore().collection('users').doc('user1/img1');
let docRef2 = firestore().doc('/users/user1/img1');
// use with docRef1  or docRef2
docRef2.get().then(docSnapshots => {
        console.log('AA1 docSnapshots data', docSnapshots.data())
    }).catch(err => {
        console.log('AA2 err', err)
    })
// error for the docRef1 and docref2 =>  Error: firebase.firestore().doc(*) 'documentPath' must point to a document.
 

Ответ №1:

Вызывая storage() , вы используете API для хранилища Firebase, который получает доступ к файлам в облачном хранилище (хранение файлов). Но затем вы говорите, что хотите получить доступ к документам в Cloud Firestore, которая представляет собой базу данных документов NoSQL.

Хотя и к Firestore, и к хранилищу можно получить доступ через SDK Firebase, они полностью разделены, и API для одного не имеет ничего общего с другим. Если вы хотите получить доступ к Firestore, используйте firebase.firestore()... (или просто firestore() на react-native-firebase).


getAll() Метод, с которым вы связались, существует в Node.js SDK для Firestore. Он не существует ни в JavaScript/Web SDK, ни в оболочке react-native-firebase. В этих пакетах SDK вам придется вызывать get каждый отдельный DocumentReference объект, или вы можете использовать in запрос FieldPath.documentId() .

Первый подход (как наиболее близкий к коду в вашем вопросе):

 let docRef1 = firestore().doc('/users/user1/img1');
let docRef2 = firestore().doc('/users/user2/img2');
Promise.all([docRef1.get(), docRef2.get()])
  .then((docSnapshots) => {
    console.log(docSnapshots[0].data(), docSnapshots[1].data());
  });
 

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

1. хеллло, спасибо за ваш ответ. Я проверяю ваш пример, но он не работает для меня. я обновил свой пост

2. Это другая проблема: вы firestore().collection('users').doc('user1/img1'); указываете на коллекцию верхнего уровня users , user документ в этой коллекции, а затем на img1 вложенную коллекцию в этом документе. Так что вам нужно будет использовать collection для этого вызов.