如果文档不存在或什么都不做,如何创建文档?

How to create a document if the document doesn't exist or else don't do anything?

我想问一下是否可以用 UID 创建一个新文档,如果它不存在但如果它存在则不要在 Firestore 中做任何事情(如果可能 return 一个错误)。 (在模块化中 Javascript)

如果可能怎么办?
注意:我已经读过这个问题:但它不符合我的要求,因为在创建文档后我也希望能够更新它。
编辑:我想在不使用 getDoc 的情况下了解,因为当我使用它时就像阅读一样,我不想花费太多超出我限制的阅读次数。

您应该首先尝试获取文档并检查它是否存在,然后继续处理您的文档 set/update。请参阅下面的示例代码:

import { doc, getDoc } from "firebase/firestore";

const docRef = doc(db, "<collection>", "<UID>");
const docSnap = await getDoc(docRef);

if (docSnap.exists()) {
  console.log("Document exist!");
  // Throws an error.
  throw new Error('Document Exist!');
} else {
  await setDoc(docRef, {
    // Document Data
  });
}

有关更多相关信息,请查看这些文档:


编辑:

如果您不想使用 getDoc,那么您可以选择使用 updateDoc,它会产生一个错误,但您仍然可以在捕捉方法。在这种方法中,您正在做一个 fail-safe 练习,即您在失败时做出响应。请参阅下面的代码:

const docRef = doc(db, "<collection>", "<UID>");

  // Produces error log if no document to update
  updateDoc(docRef, {
    // document data
  })
  .catch((error) => {
    // console.log(error);
    setDoc(docRef, {
      // document data
    });
  });

根据 documentation,一个 update 只是一个写操作:

Charges for writes and deletes are straightforward. For writes, each set or update operation counts a single write.

我们已经确定更新只是一个写入操作(不涉及读取)。写入是文档中的更改,因为您没有更改任何内容,因为文档不存在,那么您根本不会被收费。

在 web 版本 9 中,可以帮助您创建文档的函数名为 setDoc()创建覆盖 特定文档引用处的文档。

How to create a document if the document doesn't exist or else don't do anything?

如果你想实现这一点,你必须检查文档是否已经存在。如果不存在,则使用 setDoc() 创建它,否则,不采取任何操作,但 不要 在这种情况下使用 updateDoc() 函数。

请记住,updateDoc() 函数仅在您想要更新文档的某些字段而不覆盖整个文档时有用。如果文档不存在,更新操作将失败。

编辑:

根据您编辑的问题,请注意,如果不明确检查文档,您无法知道它是否存在。你确实可以不做那个检查,但你最终会一遍又一遍地覆盖文档。另请注意,写操作比读操作更昂贵。所以这是你最好的选择。