リアルタイムDBではファンアウト書き込みを行っているときに、セキュリティルール内のnewData().parent().parent()...parent()
経由で新しいデータがさまざまなパスに書き込まれるのを確認できました。セキュリティルールの異なるコレクション内の新しい文書をチェックする方法は?
const fanout = {
'users/user_a': {
username: 'foobar'
},
'usernames': {
'foobar': 'user_a'
}
};
firebase.update(fanout);
そして、このようなセキュリティ上の何か:Firestoreのセキュリティルールでこれを行う方法があるかどう
"rules": {
"users": {
$user_id: {
"username": {
".validate": "newData.parent().parent().parent().child('usernames').child(newData.val()).val() == auth.uid;
}
}
},
"usernames": {
"$username": {
".validate": "newData.parent().parent().child('users').child(auth.uid).child('username').val() == $username"
}
}
}
の場合は不思議でしたか?私はexists()
の機能を見たことがありますが、それは書かれようとしているものではなく、既存のドキュメントのためだけです。
ユーザーとユーザー名を保存する2つの別々のトランザクションを持つと、データ品質の問題が発生する可能性があります(ユーザーが突然インターネットを失ったりアプリケーションを終了したために2番目のトランザクションが保存されない場合など)。これらの全く同じ理由により、私の書き込みの90%がバッチです。回避策として、それらのすべての書き込みは、私にとって理想的ではないクラウド機能で生きています。私は、Cloud Firestoreの機能がすぐに叶うことを願っています!ありがとう! – rmmmp
申し訳ありませんが、私は本当に不十分に説明しました。私はあなたが "usernames"コレクションを取り除き、 "users"に直接問い合わせることで、ファンアウトを避けることができ、2つの異なる場所に書き込んで2つのトランザクションを使う必要がないと言うことを意味しました。 –
しかし、ユーザー名がユーザーごとに一意であることを確認するにはどうすればよいですか?私はユーザー名を変更可能にしたいので、キーとして作成する予定はありません。 – rmmmp