【问题标题】:Updating Firestore if field exists如果字段存在则更新 Firestore
【发布时间】:2022-11-18 06:07:10
【问题描述】:

我有一个简单的应用程序,允许用户输入电子邮件地址和日期。

我在 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");

let querySnapshot = getDocs(q);
let q = query(collection(db, "candidates"), where("email", "==", "..."));

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)),

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

重新访问此代码后,它现在不再起作用。当我解决这个问题时会更新。

【问题讨论】:

    标签: javascript firebase google-cloud-firestore


    【解决方案1】:

    如果电子邮件 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, {...});
    }
    

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

    【讨论】:

    • 谢谢你。在尝试你的代码时,我在你使用 updateDoc 方法的 {...} 上得到了一个意外的标记。知道为什么吗?
    • 此外,我只是将文档标题更改为电子邮件地址并移至 setDoc 命令。只是稍微整理一下,但不确定这会对您的回复产生任何影响。
    • 我得到它的工作,谢谢!我只需在 onclick 函数之外声明变量,然后在 onclick 函数内运行 if 语句。我会把工作代码放在我的问题中。
    • 代码似乎不再有效。多么奇怪。
    猜你喜欢
    • 2019-02-16
    • 2016-08-25
    • 1970-01-01
    • 2021-04-24
    • 2023-02-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多