firebase cloud firestore中某个字段的CRUD子项的最佳方法是啥?

Posted

技术标签:

【中文标题】firebase cloud firestore中某个字段的CRUD子项的最佳方法是啥?【英文标题】:What is the best way to CRUD children of a field in firebase cloud firestore?firebase cloud firestore中某个字段的CRUD子项的最佳方法是什么? 【发布时间】:2019-07-26 10:22:47 【问题描述】:

我一直被困在用户和项目之间创建多对多关系。很多人说 array 比 map 好,但我真的不知道如何开始。那么哪个更适合这个呢?我无法提交给 projNo 的孩子,也无法从集合“项目”中选择项目。下拉菜单显示“项目”集合中的 projNo,但我无法将其更改为新值。

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;

Image for the database

【问题讨论】:

【参考方案1】:

如果你只是想显示一个用户连接到一组项目,那么我会切换到一个数组。

要在 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 方法。

【讨论】:

另外,您在 componentDidMount 中创建了一个名为 this.unsubscribe 的流,但您没有取消订阅,您应该在组件卸载时取消订阅。 谢谢,但我仍然无法为 projNo 设置一个新值,该值当前为“01”。例如,我想将其更改为“04”,当我在下拉列表中单击它时,它仍然保持为“01”。另一件事,我的“onSubmit”会导致 3 个新字段,而不是给 projNo 的孩子赋值。 这些是不同的问题。请在这里打开一个新问题并链接到它,我会试一试。我相信我回答了您在我的回复中实际提出的问题。在堆栈溢出中为每个问题保留一个问题有助于其他有相同问题的人找到解决方案并从中受益。 这件事急需你的帮助***.com/questions/55094042/…

以上是关于firebase cloud firestore中某个字段的CRUD子项的最佳方法是啥?的主要内容,如果未能解决你的问题,请参考以下文章

导出 Firestore 备份数据的云功能。使用 firebase-admin 或 @google-cloud/firestore?

Expo + firebase@9.0.1/9.0.0: @firebase/firestore:, Firestore (9.0.0): 无法到达 Cloud Firestore 后端

尝试初始化 Cloud Firestore 时,firebase.firestore() 不是函数

尝试初始化 Cloud Firestore 时,firebase.firestore() 不是函数

Firebase:Firestore 未在 Cloud Function 的计划函数中更新数据

@firebase/firestore:Firestore (8.6.2):无法访问 Cloud Firestore 后端(React Js)