我想创建Firestore文档(如果不存在)-如果存在,请跳过它们(不更新)。 这是流程
var arrayOfRandomIds = [array of 500 random numbers];
for (var id of arrayOfRandomIds)
{
var ref = db.collection("tickets").doc(id);
batch.set(ref, {name: "My name", location: "Somewhere"}, { merge: true });
}
batch.commit();
我只想知道,如果存在的话,这会覆盖现有文件吗?我不希望任何东西被覆盖,只是跳过。
谢谢。
答案 0 :(得分:4)
我认为您可以使用安全规则来完成此任务。这样一来,您无需为阅读额外的文档(如果该文档已经存在)而付费。
service cloud.firestore {
match /databases/{database}/documents {
match /tickets/{id} {
allow create;
}
}
}
答案 1 :(得分:2)
Firestore没有本地的“创建但不覆盖”操作。这是唯一可用的操作:
您可以执行transaction(而不是批处理)来检查文档是否存在,然后有条件创建该文档(如果尚不存在)。您将必须在事务处理程序中编写该逻辑。
答案 2 :(得分:1)
我想创建Firestore文档(如果不存在)-如果存在,请跳过它们(不更新)。
在这种情况下,应在写操作发生之前检查集合中是否确实存在特定文档。如果它不存在,请创建它,否则不执行任何操作。
因此,您应该仅使用set()
函数,而无需传递merge: true
。
答案 3 :(得分:0)
同时有一个“创建但不覆盖”功能。 假设您使用 JavaScript,这里是参考:https://googleapis.dev/nodejs/firestore/latest/DocumentReference.html#create
这是文档中相应的示例代码:
let documentRef = firestore.collection('col').doc();
documentRef.create({foo: 'bar'}).then((res) => {
console.log(`Document created at ${res.updateTime}`);
}).catch((err) => {
console.log(`Failed to create document: ${err}`);
});
使用 .create()
而不是 .set()
应该可以为您解决问题,而无需依赖应用程序逻辑的安全规则。