我有一个简单的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事务中验证文档是否存在的正确方法是什么?
答案 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;
}
然后你可以尝试每次都设置用户对象,它只会在第一次成功。但是,显然,这只有在你真的不希望你的客户端在将来更新用户对象时才有效。