Запрос Firestore «where» работает не так, как ожидалось

#javascript #firebase #google-cloud-firestore

#javascript #firebase #google-cloud-firestore

Вопрос:

Я пытаюсь выполнить простой запрос из моей базы данных firestore, но мне не хватает чего-то очень очевидного. Я пытался искать в Интернете, но ничего не работает. Для некоторого фона у меня есть коллекция «cf», в которой я пытаюсь запросить объекты, у которых значение «hsc» равно «1», но я ничего не получаю взамен.

введите описание изображения здесь

 exports.getOneTodo = (request, response) => {
    db
        .collection('cf')
        .where("hsc", "==", "1") 
        .get()
        .then((doc) => {

            if (!doc.exists) {
                return response.status(404).json(
                    { 
                        error: 'Todo not found' 
                    });
            }
            TodoData = doc.data();
            TodoData.todoId = doc.id;
            return response.json(TodoData);
        })
        .catch((err) => {
            console.error(err);
            return response.status(500).json({ error: error.code });
        });
};
  

введите описание изображения здесь
Ниже приведены правила firestore.

 rules_version = '2';
service cloud.firestore {
  match /databases/{database}/documents {
    match /{document=**} {
      allow read, write
    }
  }
}
  

Я тестирую это через почтальона. Я попытался изменить правила firebase, чтобы они были верными для чего угодно, но, похоже, ничего не работает.

ОБНОВЛЕНИЕ: ниже показано, как я инициализировал свою базу данных

 const admin = require('firebase-admin');

admin.initializeApp();

const db = admin.firestore();

module.exports = { admin, db };
  

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

1. При переполнении стека не показывайте изображения кода и текста. Скопируйте код в вопрос и отформатируйте его так, чтобы его было легко читать, копировать и искать.

2. Извините, просто изменил его.

3. Пожалуйста, также измените свои правила безопасности.

4. Просто изменил их тоже 🙂

5. Если вы жестко "1" закодируете строку в запросе, вы все равно не получите результатов?

Ответ №1:

Ваш код ожидает один документ, но он должен быть подготовлен к тому, что запрос вернет несколько документов. Когда вы запускаете get() объект запроса, он выдает объект QuerySnapshot. Как вы можете видеть из документации API, у него нет exists свойства. Проверка этого свойства всегда будет «false». Вместо этого вам нужно проверить результаты, чтобы сначала посмотреть, были ли какие-либо документы, а затем получить первый:

     db
        .collection('cf')
        .where("hsc", "==", "1") 
        .get()
        .then((qsnapshot) => {
            if (qsnapshot.docs.length > 0) {
                const dsnapshot = qsnapshot.docs[0];
                // send the response using dsnapshot.data()
            }
            else {
                // send the response saying nothing was found
            }
        })

  

Ответ №2:

теперь вам нужно использовать

   db.collection("id").whereGreaterThan("field","value")
  .whereEqualTo("field","value")
  .whereLessThen("field","value")