#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. Привет! вы пробовали подход Эмиля? у вас это сработало?