Firebase Cloud Firestore do c .data (). Includes или .IndexOf не работает - PullRequest
1 голос
/ 03 августа 2020

Я пытаюсь работать с массивом, пытаюсь запустить doc.data().includes и doc.data().indexOf в массиве, который я хранил в облачном хранилище, массив - единственное, что существует в do c.

Данные расположены следующим образом

    0: example@gmail.com
    1: firebase@gmail.com
    2: new@gmail.com

Чтобы получить данные, я просто делаю

firebase.firestore().collection('mails').doc('emails').get().then((doc) => {
            if (doc.exists) {
                console.log(doc.data()); //prints the list of emails in form of array
                doc.data().IndexOf(email); //error IndexOf doesn't exist
                doc.data().includes(email); //error includesOf doesn't exist
            }
            else {
                console.log('data doesn't exist');

            }

        });

Обзор базы данных Cloud Firestore

Ответы [ 2 ]

2 голосов
/ 03 августа 2020

Чтобы получить доступ к doc.data().IndexOf или doc.data().includes или любым другим функциям, связанным с массивом, просто преобразуйте doc.data() в массив следующим образом:

var docArray = Object.values(doc.data());
docArray.includes(stringToSearchFor);

или

Object.values(doc.data()).includes(stringToSearchFor);

это позволит вам запускать docArray.includes и docArray.IndexOf. Причина преобразования заключается в том, что firebase возвращает весь do c, который является объектом объектов, вы можете увидеть это в console.log (do c .data ()) и увидеть поле прототипа. Это происходит потому, что firestore хранит в массиве объект json, что означает, что номера индексов массива, которые вы видите, на самом деле не являются индексными номерами, а просто ключами объектов.

означает

0: example@gmail.com
1: firebase@gmail.com
2: new@gmail.com

где 0, 1, 2 - это индекс (или, как кажется), а example@gmail.com, firebase@gmail.com, new@gmail.com - значение, но в firestore 0, 1, 2 на самом деле просто ключи, а не индекс. Итак, чтобы получить либо ключ (числа), либо значения (электронные письма), мы просто запускаем Object.keys(doc.data())// will return numbers или Object.values(doc.data())//will return emails, и вы получите массив, который вам нужен, и теперь вы можете запускать операции с этим массивом.

1 голос
/ 03 августа 2020

Я бы посоветовал вам хранить свои данные в массиве , а не как отдельные поля, как показано на снимке экрана вашей базы данных Firestore.

В настоящее время ваш документ Firestore содержит 6 разных полей и с doc.data() вы получаете все 6 полей в этом документе как один JavaScript Object: вот почему методы Array не могут работать. Если вы сохраните эти данные в одном массиве (т.е. в одном поле типа Array), все будет в порядке.

Вы можете попробовать следующий код:

  const docRef = firebase.firestore().collection('mails').doc('emails');

  docRef
    .set({
      mails: ['example@gmail.com', 'firebase@gmail.com', 'new@gmail.com'],
    })
    .then(() => {
      return docRef.get();
    })
    .then((doc) => {
      if (doc.exists) {
        const email = 'example@gmail.com';
        console.log(doc.data().mails); 
        console.log(doc.data().mails.indexOf(email)); 
        console.log(doc.data().mails.includes(email)); 
      }
    });
...