Firestore创建文档(如果不存在),如果存在则跳过

时间:2020-01-30 16:03:02

标签: firebase google-cloud-firestore

我想创建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();

我只想知道,如果存在的话,这会覆盖现有文件吗?我不希望任何东西被覆盖,只是跳过。

谢谢。

4 个答案:

答案 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() 应该可以为您解决问题,而无需依赖应用程序逻辑的安全规则。