繁体   English   中英

尝试更新 firestore 数据库中的单个字段

[英]Trying to update a single field in a firestore database

我有一个具有以下结构的 firestore 数据库。 在此处输入图像描述

我想要做的是在用户单击按钮时更新所选值。 我有要添加的新值,但出现错误。

 <button className='buttonCheck' onClick={checkAnswer}>CHECK MY ANSWER</button>

当我单击按钮时,它会调用“checkAnswer”function

function AnswerComponent(props) {
  let totalNoAnswers = props.totalAnswers;
  let answers = props.answersarray; 
  
  const [valueA, setValue] = useState() // make this mean something better
  const [showCongratsModal, setShowCongratsModal] = useState(false);
  const [showCongratsURL, setShowCongratsURL] = useState("")
  const [showWindowContent, setShowWindowContent] = useState("")
  const [selectedAnswerGroup, setSelectedAnswerGroup] = useState("")
  const [chosenCount, setChosenCount]= useState()

  function checkAnswer() {   
    setShowCongratsModal(true)
    if (valueA === true) {
      setShowCongratsURL("https://firebasestorage.googleapis.com/v0/b/assignment219000170.appspot.com/o/videos%2Fcongrat_w3_s.mp4?alt=media&token=034ea1bc-b3e0-4b51-957f-854dae963896")
    } else if (valueA === false) {
      setShowWindowContent("Incorrect answer - please try again.")            
    } else {
      setShowWindowContent("Please choose an answer before proceeding.")            
    }

    const updateFirestore = async () => {
      const db = firebase.firestore();      
      const collectionId = "Questions";
      const documentId = "balances";
    
      const snapshot = db.collection(collectionId).doc(documentId);
      console.log("> ", snapshot)
      console.log(">> ", selectedAnswerGroup)

      const res = await snapshot.set({      
        balances: {
          balances: {
            answers: {
              [selectedAnswerGroup]: {
                chosen: chosenCount
              }
            }
          }
        }
      }, {merge: true})
    console.log("1", res)
    }
    updateFirestore()
    
  }

变量 selectedAnswerGroup 包含“answer_1” - 而“chosenCount”将包含一个新数字,因此使用上面的内容,我想我会更新数据库。

但是,我在控制台上收到一个错误 Uncaught (in promise) TypeError: firestore.collection(...).doc(...).balances is undefined

我看不出我做错了什么。

我是否需要将其包含在 firebase.auth() 块中?

您收到此错误: TypeError: firestore.collection(...).doc(...).balances is undefined由于您构建引用的方式。 这是您遇到错误的代码行:

const snapshot = await firestore.collection(collectionId).doc(documentId).balances.balances.answers[selectedAnswerGroup]

TypeError: undefined当读取属性或在未定义的变量上调用 function 时发生。 您正在使用点符号来访问method ,因此它将balances读取为一种方法。

您的参考应始终遵循以下模式:

db.collection("main_collection").doc("main_collection's_document").collection("sub_collection").doc("sub_collection's_document");

查看Cloud Firestore 数据 model ,这是开始构建对 Firestore 数据结构的引用的好方法。

要更新 object 的 map 内的特定字段,您必须定义文档标识符并基于您的 Firestore 数据结构构建 map。 请参阅下面的代码:

function checkAnswer() {
    setShowCongratsModal(true)
    if (valueA === true) {
      setShowCongratsURL("https://firebasestorage.googleapis.com/v0/b/assignment219000170.appspot.com/o/videos%2Fcongrat_w3_s.mp4?alt=media&token=034ea1bc-b3e0-4b51-957f-854dae963896")
    } else if (valueA === false) {
      setShowWindowContent("Incorrect answer - please try again.")            
    } else {
      setShowWindowContent("Please choose an answer before proceeding.")            
    }
    
    updateFirestore()
    .then((snapshot) => {
        console.log('updateFirestore() successfully called!');
        console.log(snapshot);
    })
    .catch((e) => {
        console.log(e);
    });
}

async function updateFirestore() {
    const db = firebase.firestore();   
    const collectionId = "Questions";
    const documentId = "balances";
    
    // You could also log something here to ensure that this async function has been ran.
    // console.log(selectedAnswerGroup);
    // console.log(chosenCount);

    const snapshot = db
    .collection(collectionId)
    .doc(documentId)
    .set(
    {      
        balances: {
            balances: {
                answers: {
                    [selectedAnswerGroup]: {
                        chosen: chosenCount
                    }
                }
            }
        }
    }, {merge: true});

    return snapshot;
}

您可以查看嵌套对象文档中的设置文档更新字段以获取更多信息。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM