在我的Firestore数据中,我有以下
- 项目ID
- 采购项目数量:1
- 项目左:3
如果用户想更新要为相同ItemID购买的物品,或者在ItemsIDirestore安全规则,事情会变得复杂。
我写了以下测试:
const initialUserDoc = adminFirestore.collection("Users").doc(VALID_USER_ID).collection("Cart").doc(documentID);
await initialUserDoc.set({
"amountOfItemsToPurchase": 1,
"itemsLeft": 3
});
// Get the user's node and grab the example user
const userTestRef = db.collection("Users").doc(VALID_USER_ID).collection("Cart").doc(documentID);
await firebase.assertFails(userTestRef.set({
"amountOfItemsToPurchase": firebase.firestore.FieldValue.increment(1000),
}, {merge: true}));
该测试结果如下:Error: Expected request to fail, but it succeeded
对于每个场景(更新或创建(,我想要的是避免amountOfItemsToPurchase
超过itemsLeft
,为此我使用以下内容:CCD_ 5=>这将在允许创建部分。
这导致以下情况:是否将调用allow-create或allow-update**?以及为什么不考虑itemsLeft
变量
从您的描述和评论来看,您的安全规则看起来还可以。
让我写下它以供进一步讨论:
match /items/{id} {
allow create, update:
if request.resource.data.amountOfItemsToPurchase < request.resource.data.itemsLeft;
}
第一个问题:使用request.resource
可以在更新后读取字段的值。
第二个问题:当使用set
时,FieldValue.increment
sentinel不递增,而是设置值。您应该使用set(, {merge:true}
0函数来实际增加值。
第三个问题:具有set
功能的FieldValue.increment
和{merge: true}
确实增加了值!
所以最后这个规则还是很好的,我可以确认它对我有效