Как непрерывно добавлять объекты во вложенную коллекцию в Firestore - PullRequest
0 голосов
/ 30 декабря 2018

Я пишу приложение React / Redux, которое использует Firebase Auth / Firestore для отслеживания упражнений пользователя в тренажерном зале.У меня есть форма Redux для обработки данных, и у меня есть пример структуры данных, которую я хочу получить в Firestore:

users {
  id {
    name: 'John Smith'
    uid: 'k1s7fxo9oe2ls9u' (comes from Firebase Auth)
    exercises: {
      {
        name: 'Bench Press',
        sets: 3,
        reps: 10,
        lbs: 100,
      }
    }
  }
}

Однако я не могу понять, как продолжать добавлять новые объекты в упражненияПодколлекция (в Firestore, я думаю, это будет тип поля карты).То, что я хочу сделать - это иметь новые объекты в «упражнениях», когда пользователь отправляет новые формы.Например, если пользователь хочет добавить упражнение Deadlift, оно будет выглядеть следующим образом:

   users {
      id {
        name: 'John Smith'
        uid: 'k1s7fxo9oe2ls9u' (comes from Firebase Auth)
        exercises: {
          {
            name: 'Bench Press',
            sets: 3,
            reps: 10,
            lbs: 100,
          },
          {
            name: 'Deadlift',
            sets: 3,
            reps: 12,
            lbs: 120,
          }
        }
      }
    }

Вызов db.collection('users').doc(doc.id).add({"exercises": values}); просто обновляет уже существующий объект жима лежа, а не добавляет новый напредставление формы.

Но вызов db.collection('users').doc(doc.id).add({"exercises": values}); дает мне эту ошибку: Uncaught (в обещании) TypeError: _firebase__WEBPACK_IMPORTED_MODULE_3 __. Default.collection (...). Doc (...). Add не является функцией.

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

Это мой компонент:

import React, { Component }  from 'react';
import { connect } from 'react-redux';
import { Field, reduxForm } from 'redux-form';
import db from '../../../firebase';
import '@firebase/firestore';
import { store } from '../../../App';

const formSubmit = (values)=> {
    const currentUserId = store.getState().auth.uid;

    db.collection("users").get().then((usersSnapshot) => {
        usersSnapshot.forEach((doc) => {
          // looking for the current user and then updating their data
          if(doc.data().uid === currentUserId) {
            db.collection('users').doc(doc.id).add({
              "exercises": values,
            });
          }
        });
      });
}


let ExercisesForm = ({ handleSubmit }) => (
    <form onSubmit={handleSubmit(formSubmit)}>
      <div>
        <Field name="name" component="input" type="text" placeholder="Exercise Name" />
      </div>
      <div>
        <Field name="sets" component="input" type="number" />
        <label htmlFor="sets"> sets</label>
      </div>
      <div>
        <Field name="reps" component="input" type="number" />
        <label htmlFor="reps"> reps</label>
      </div>
      <div>
        <Field name="lbs" component="input" type="number" />
        <label htmlFor="lbs"> lbs</label>
      </div>
      <button type="submit">Submit</button>
    </form>
)

ExercisesForm = reduxForm({
  form: 'exercise'
})(ExercisesForm)

const mapStateToProps = state => ({
  uid: state.auth.uid,
});

export default connect(
  mapStateToProps,
  undefined
)(ExercisesForm);

1 Ответ

0 голосов
/ 31 декабря 2018

Вы можете сказать:

db
    .collection('users')
    .doc(doc.id)
    .collection('exercises')
    .add(values);

Где values содержит все поля документа, который вы хотите добавить.В подгруппе упражнений будет создан новый документ со случайным идентификатором.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...