Извлечение документа из коллекции по полю в Firestore с помощью REST API

#node.js #rest #google-cloud-firestore #axios #crud

#node.js #rest #google-облако-firestore #axios #crud

Вопрос:

Я пытаюсь получить документ Firestore по одному из значений его поля в Node.js , с Аксиосом. Мой документ в Firestore выглядит следующим образом (принадлежит моей коллекции «пользователи»):

 userName: 'John Doe'
userEmail: 'john.doe@example.com'
  

Я знаю, что могу получить всю коллекцию с помощью такого кода:

 axios.get(`https://firestore.googleapis.com/v1/projects/<PROJECTIDHERE>/databases/(default)/documents/<COLLECTIONNAME>`)
     .then(response => { 
         console.log(response); 
        })
        .catch(error => { 
            console.log(error); 
        });
  

Кроме того, я знаю, что могу получить документ коллекции по его идентификатору следующим образом:

 axios.get(`https://firestore.googleapis.com/v1/projects/<PROJECTIDHERE>/databases/(default)/documents/<COLLECTIONNAME>/<DOCID>`)
    .then(response => {
        console.log(response);
    })
    .catch(error => {
        console.log(error);
    });
  

Однако, как и в вопросе, я хочу выполнить поиск во всей коллекции, чтобы получить документ с полем userEmail ‘john.doe@example.com «.

Согласно Джин Снайман в своем блоге, метод axios должен иметь structuredQuery .

Его пример показывает что-то вроде этого:

 axios.post('https://firestore.googleapis.com/v1/projects/<PROJECTIDHERE>/databases/(default)/documents:runQuery', 
        { structuredQuery: 
            { from: [
                { collectionId: 'posts' 
            }
        ], 
        orderBy: [
            { field: 
                { fieldPath: 'created' 
            }, direction: 'DESCENDING' }
        ], select: { fields: 
            [
                { fieldPath: 'title' }, 
                { fieldPath: 'summary' }, 
                { fieldPath: 'category' }, 
                { fieldPath: 'created' }
            ] 
        }, 
        where: { 
            compositeFilter: { 
                filters: [
                    { fieldFilter: { 
                        field: { 
                            fieldPath: 'published' 
                        }, 
                            op: 'EQUAL', 
                            value: { 
                                booleanValue: true 
                            } 
                        } 
                    }
                ], op: 'AND' 
            } 
        }, 
            limit: 4 
            } 
        }
        ).then(res => { 
            console.log(res) 
        })
        .catch(error => { 
            
  

Пытаясь следовать его логике, я пришел с таким кодом:

 await axios.get(`https://firestore.googleapis.com/v1/projects/${projectID}/databases/(default)/documents:runQuery/key=${key}`,
      {
        structuredQuery:
        {
          from: [
            {
              collectionId: collection
            }
          ],
          where: {
            compositeFilter: {
              filters: [
                {
                  fieldFilter: {
                    field: {
                      fieldPath: 'userEmail'
                    },
                    op: 'EQUAL',
                    value: {
                      stringValue: 'john.doe@example.com'
                    }
                  }
                }
              ], op: 'AND' 
            }
          }
        }
      }
    )
      .then(response => {
        console.log(response.data);
      })
      .catch(error => {
        console.log(error);
      });
  

Однако я извлекаю пустой объект, что указывает на то, что я делаю что-то не так. Ну, мой интерес заключается в получении документов по указанному полю. Если вы нашли решение без Axios и structuredQuery, оно отлично подходит для меня.

Ответ №1:

Не уверен насчет axios, выглядит хорошо по сравнению с примером, который вы показали. Но, возможно, вы используете другую версию, попробуйте снова проверить документы и обновить библиотеки.

Вы также можете использовать официальную библиотеку узлов для запроса по значению поля, как описано здесь .

 const usersRef = db.collection('users');

// Create a query against the collection
const queryRef = usersRef.where('userEmail', '==', 'john.doe@example.com');
const snapshot = await queryRef.get();
  

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

1. Помимо того факта, что в примере, которым вы поделились, говорится, что я должен включить Rest API, я на самом деле не вижу никаких ссылок в образце, ссылающихся на него. В примере показан пользовательский пример Rest API, но не официальный Firestore Rest API .

2. Привет! вы пробовали подход Эмиля? у вас это сработало?