validation - indexon - firestore rules
¿Qué regla de Firebase evitará duplicados en una colección basada en otros campos? (1)
Como las reglas de seguridad no pueden iterar una lista de registros para encontrar la que contiene un cierto bit de datos, el truco aquí es almacenar los registros mediante una identificación que permita un fácil acceso. Hay un excelente artículo sobre desnormalización que ofrece algunas buenas ideas sobre esta práctica.
En este caso, si su caso de uso lo permite, es posible que simplemente desee cambiar su estructura de datos para que los registros sean almacenados por la identificación del usuario, en lugar de almacenar la ID como un valor en el registro, así:
/users/user_id/items/item_id/subscribers/user_id/
De hecho, como verá en la desnormalización, incluso puede beneficiarse dividiendo las cosas aún más, dependiendo del tamaño exacto de sus datos y de cómo lo leerá más adelante:
/ users / user_id / items / user_id / item_id / subscribers / item_id / user_id
En cualquiera de estos formatos, ahora puede evitar duplicados y bloquear la seguridad bastante bien con algo como esto:
{
"users": {
"$user_id": { ".write": "auth.id === $user_id" }
},
"subscribers": {
"$subscriber_id": { ".write": "auth.id === $subscriber_id" }
}
}
Estoy creando una aplicación que permite a los usuarios crear elementos y luego permitir que otros usuarios se suscriban a esos elementos. Me cuesta crear una regla que evite que los usuarios se suscriban más de una vez a un elemento.
Aquí hay un ejemplo de mi estructura de datos (anonimizada, de ahí los valores "OMITTED"):
{
"OMITTED" : {
"name" : "Second",
"body" : "this is another",
"userName" : "Some User",
"userId" : "OMITTED",
"created" : 1385602708464,
"subscribers" : {
"OMITTED" : {
"userName" : "Some User",
"userId" : "OMITTED"
}
}
}
}
Aquí están mis reglas de Firebase en este momento:
{
"rules": {
".read": true,
".write": "auth != null",
"items": {
"$item": {
".write": "!data.exists()",
".validate": "newData.hasChildren([''name'', ''body'', ''userId'', ''userName'']) && newData.child(''userId'').val() == auth.id",
"subscribers": {
"$sub": {
".validate": "newData.hasChildren([''userId'', ''userName'']) && newData.child(''userId'').val() != data.child(''userId'').val()"
}
}
}
}
}
}
¿Cómo puedo evitar que los usuarios se suscriban más de una vez? ¿Cuál es la regla que necesito para evitar usuarios duplicados dentro de la lista de subscribers
según userId
?