Каков наилучший способ CRUD детей поля в firebase облачном firestore? - PullRequest
0 голосов
/ 05 марта 2019

Я застрял навсегда, чтобы создать отношение многих ко многим между пользователем и проектом.Многие люди говорили, что массив лучше, чем карта, но я не знаю, с чего начать.Так что лучше для этого?Я не могу подчиниться ребенку projNo и не могу выбрать проект из коллекции "project".В раскрывающемся списке отображается projNo из коллекции "project", но я не могу изменить его на новое значение.

import React, { Component } from 'react';
import fire from '../config/Fire';
import { Link } from 'react-router-dom';
import Navigation from '../components/Navigation';

class EditUser extends Component {

  constructor(props) {
    super(props);
    this.unsubscribe = null;
    this.state = {
      key: '',
      authority: '',
      name: '',
      email: '',
      password: '',
      projNo: {projNo1: '', projNo2: '', projNo3: ''},
      project: []
    };
  }

  onCollectionUpdate = (querySnapshot) => {
    const project = [];
    querySnapshot.forEach((doc) => {
      const { projNo } = doc.data();
      project.push({
        key: doc.id,
        doc, // DocumentSnapshot
        projNo
      });
    });
    this.setState({
      project
    });
  }

  componentDidMount() {
    const ref = fire.firestore().collection('user').doc(this.props.match.params.id);
    ref.get().then((doc) => {
      if (doc.exists) {
        const user = doc.data();
        this.setState({
          key: doc.id,
          authority: user.authority,
          name: user.name,
          email: user.email,
          password: user.password,
          projNo: user.projNo
        });
      } else {
        console.log("No such document!");
      }
    });

    this.unsubscribe = fire.firestore().collection('project').onSnapshot(this.onCollectionUpdate);
  }

  onChange = (e) => {
    const state = this.state
    state[e.target.name] = e.target.value;
    this.setState({user:state});
  }

  onSubmit = (e) => {
    e.preventDefault();

    const { authority, name, email, password, projNo, projNo1, projNo2, projNo3 } = this.state;

    const updateRef = fire.firestore().collection('user').doc(this.state.key);
    updateRef.set({
      authority,
      name,
      email,
      password,
      projNo,
      projNo1,
      projNo2,
      projNo3
    }).then((docRef) => {
      this.setState({
        key: '',
        authority: '',
        name: '',
        email: '',
        password: '',
        projNo: { projNo1: '', projNo2: '', projNo3: '' }
      });
      this.props.history.push("/show/"+this.props.match.params.id)
    })
    .catch((error) => {
      console.error("Error adding document: ", error);
    });
  }

  render() {
    return (
    <div>
       ...
    </div>
    );
  }
}

export default EditUser;

Изображение для базы данных

1 Ответ

0 голосов
/ 05 марта 2019

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

Чтобы добавить и удалить проекты из массива в firestore, вы можете обратиться к документации по firebase.здесь: https://firebase.google.com/docs/firestore/manage-data/add-data?authuser=0#update_elements_in_an_array

Поэтому, когда вы создаете пользователя, просто переключитесь на настройки массива, например так:

updateRef.set({
          authority,
          name,
          email,
          password,
          projNo: [projNo1,projNo2,projNo3]
        })

В будущем, если вы хотите атомарно добавлять или удалять проекты измассив projNo, это может быть достигнуто следующим образом:

// Add
updateRef.update({
    projNo: firebase.firestore.FieldValue.arrayUnion("projNo16")
});

// Remove 
updateRef.update({
    projNo: firebase.firestore.FieldValue.arrayRemove("projNo1")
});

Помните, вам нужно будет импортировать firebase в файл, где вы вызываете выше, иначе вы не можете использовать методы FieldValue.

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