firebase 如果字段存在,则更新Firestore

bt1cpqcv  于 2022-11-25  发布在  其他
关注(0)|答案(1)|浏览(143)

我有一个简单的应用程序,允许用户输入电子邮件地址和日期。
我在Firestore中有一个集合,文档名称是自动生成的,两个字段保存在那里。

我希望能够只更新日期,如果电子邮件ID已经在数据库中(没有太多的帮助,如果它更新电子邮件地址为匹配的日期,因为将有许多重复的日期)。
任何帮助都是极好的。
以下是我目前为止的JS:

const db = getFirestore(firebaseApp);
const btn = document.getElementById("btn");

const docRef = btn.addEventListener('click', (e) => {
    let mail = document.getElementById("email").value;
    e.preventDefault,
    setDoc(doc(db, "candidates", mail), {
        email: document.getElementById("email").value,
        date: Timestamp.fromDate(new Date(document.getElementById("date").value)),
    });
});

问题已解决,最终工作代码:

const db = getFirestore(firebaseApp);
const btn = document.getElementById("btn");

const docRef = btn.addEventListener('click', (e) => {
    let mail = document.getElementById("email").value;
    e.preventDefault,
    setDoc(doc(db, "candidates", mail), {
        email: document.getElementById("email").value,
        date: Timestamp.fromDate(new Date(document.getElementById("date").value)),

    
    });
});

const candidateRef = doc(db, "candidates", mail);

await updateDoc(candidateRef, {
  date: date
});
jdgnovmf

jdgnovmf1#

如果电子邮件ID已在数据库中,我希望能够仅更新日期
您应该首先查询数据库,检查是否存在包含该电子邮件的文档,如果存在,则更新该文档。
大致如下(我们假设每个电子邮件只有一个文档):

import { collection, query, where, getDocs, updateDoc } from "firebase/firestore";

const q = query(collection(db, "candidates"), where("email", "==", "..."));

const querySnapshot = await getDocs(q);
if (querySnapshot.size === 1) {
   const docRef = querySnapshot.docs[0].ref;
   await updateDoc(docRef, {...});
}

请注意,您可以根据您的功能要求和数据模型使用事务。在这种情况下,您需要使用电子邮件作为文档ID,因为您无法在JS SDK的事务中使用查询。

相关问题