我想创建两个文档
Account/{uid} {
consumerId: ... //client generated id
}
Consumer/{consumerId} {
...
}
我有一个消费者集合的安全规则
match /Consumer/{consumerId} {
allow create: if (consumerId == get(/databases/$(database)/documents/Account/$(request.auth.uid)).data['consumerId'];
}
我需要确保帐户只能添加与其帐户文档中的consumerId
对应的客户文档。两个文件应该一起创建。我一直在尝试使用事务执行此操作但我不断收到错误“事务失败所有重试。”。什么是错的,我该如何解决?
答案 0 :(得分:0)
数据变量是一个对象而不是数组,因此您应该使用data.consumerId
而不是data['consumerId']
:
match /Consumer/{consumerId} {
allow create: if consumerId == get(/databases/$(database)/documents/Account/$(request.auth.uid)).data.consumerId;
}
答案 1 :(得分:0)
我最终通过批处理写入和安全规则来完成此操作。
match /consumer/{cid} {
function isNewResource() { return resource == null; }
allow create: if isRegistered();
allow read, update: if isNewResource();
}
然后在客户端添加一些类似的内容
createThing() {
const db = firebase.firestore();
const { uid, displayName } = this.auth.currentUser;
const batch = this.db.batch();
// Essentially generating a uuid
const newConsumerRef = db.collection("consumer").doc();
// Update the user doc
batch.update(
db.collection('/users').doc(uid),
{ consumerID: newConsuemrRef.id }
);
// Update the admins field in the new doc
batch.set(newConsumerRef, {
admins: {
[uid]: displayName,
},
});
return batch.commit();
}
我的问题是相同的,但是实际上要向集合中的字段写入对象键,因此看起来有点时髦
batch.update(
db.collection('/users').doc(uid),
{ [`adminOf.${newRef.id}`]: 'some special name' }
);