检查文档存在于Firestore事务

时间:2018-02-21 20:30:33

标签: swift firebase transactions google-cloud-firestore

我有一个简单的Firestore事务,它首先读取以验证文档的存在,如果它不存在,则执行一些写操作。

代码段看起来像这样

Firestore.firestore().runTransaction({ (transaction, errorPointer) -> Void in    
  let snapshot: DocumentSnapshot
  // First check if user already exists.
  let userRef = firestore.document("users/\(user.uid)")
  do {
    try snapshot = transaction.getDocument(userRef)
  } catch let fetchError as NSError {
    errorPointer?.pointee = fetchError
    return
  }
  if !snapshot.exists {
    // Document doesn't exist. Start write operation...
    ...

当文档不存在时,getDocument似乎没有返回有效的快照,而是抛出错误。我不想依赖错误来断定文档不存在(因为它可能会混淆其他错误)。

在Firestore事务中验证文档是否存在的正确方法是什么?

1 个答案:

答案 0 :(得分:4)

好吧,你可以尝试做这样的事情:

Firestore.firestore().runTransaction({ (transaction, errorPointer) -> Void in    
  let snapshot: DocumentSnapshot
  if let snapshot = try? transaction.getDocument(userRef) {
    if snapshot.exists {
     // Snapshot already exists!
     return
    }
  } 
  print("Document doesn't exist. Let's get to work!")
  // Perform write operations here
  ...

虽然取决于您要查看的内容,但使用安全规则可能更容易实施此操作。

例如,以下规则允许您创建新的用户对象,但绝不会覆盖它。

match /users/{userID} {     
  allow create: if request.auth.uid == userID;
  allow update: if false;
}

然后你可以尝试每次都设置用户对象,它只会在第一次成功。但是,显然,这只有在你真的不希望你的客户端在将来更新用户对象时才有效。

相关问题