如果文档不存在或什么都不做,如何创建文档?
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()
函数仅在您想要更新文档的某些字段而不覆盖整个文档时有用。如果文档不存在,更新操作将失败。
编辑:
根据您编辑的问题,请注意,如果不明确检查文档,您无法知道它是否存在。你确实可以不做那个检查,但你最终会一遍又一遍地覆盖文档。另请注意,写操作比读操作更昂贵。所以这是你最好的选择。
我想问一下是否可以用 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()
函数仅在您想要更新文档的某些字段而不覆盖整个文档时有用。如果文档不存在,更新操作将失败。
编辑:
根据您编辑的问题,请注意,如果不明确检查文档,您无法知道它是否存在。你确实可以不做那个检查,但你最终会一遍又一遍地覆盖文档。另请注意,写操作比读操作更昂贵。所以这是你最好的选择。