Also in Echtzeit DB, ich könnte prüfen, ob neue Daten in verschiedenen Pfaden über newData().parent().parent()...parent()
in den Sicherheitsregeln geschrieben werden, wenn ich Fanout schreibe.Wie wird nach neuen Dokumenten in einer anderen Sammlung nach Sicherheitsregeln gesucht?
z.B.
const fanout = {
'users/user_a': {
username: 'foobar'
},
'usernames': {
'foobar': 'user_a'
}
};
firebase.update(fanout);
Und eine Sicherheit etwas wie folgt aus:
"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"
}
}
}
Wenn mich gefragt, ob es einen Weg gibt diese Sicherheitsregeln des in Firestore zu tun? Ich habe die exists()
Funktion gesehen, aber es ist nur für die vorhandenen Dokumente, nicht etwas, das geschrieben wird.
Ich möchte vermeiden, dass 2 separate Transaktionen zum Speichern von Benutzer und Benutzername möglicherweise Datenqualitätsprobleme verursachen können (z. B. was passiert, wenn die zweite Transaktion nie gespeichert wird, weil der Benutzer plötzlich Internet verliert oder die App schließt). 90% meiner Schreibvorgänge sind aus genau diesen Gründen Stapel. Als Workaround leben all diese Texte in Cloud Functions, was für mich nicht ideal ist. Ich hoffe, diese Funktion landet bald in Cloud Firestore! Vielen Dank! – rmmmp
Sorry, ich habe es wirklich schlecht erklärt. Ich wollte damit sagen, dass man Fanout vermeiden kann, indem man die "usernames" -Kollektion loswird und nur "Benutzer" direkt abfragt, so dass man nicht an zwei verschiedene Orte schreiben und 2 Transaktionen verwenden muss. –
Aber wie stelle ich sicher, dass Benutzernamen pro Benutzer eindeutig sein sollten? Ich plane nicht, es als Schlüssel zu machen, da wir Benutzernamen veränderbar machen wollen. – rmmmp