Hice una función en la nube para eliminar los mensajes de alerta caducados y mis datos están estructurados como se muestra a continuación:

Alerts
|-{country1}
  |-{c1_state1}
    |-{key}
      |-msg: "bla bla"
      |-end: 1601251200000
  |-{c1_state2}
    |-{key}
      |-msg: "bla bla"
      |-end: 1601251200000

|-{country2}
  |-{c2_state1}
    |-{key}
      |-msg: "bla bla"
      |-end: 1601251200000
  |-{c2_state2}
    |-{key}
      |-msg: "bla bla"
      |-end: 1601251200000

Mirando los mensajes de registro, noté que hay muchas advertencias para cada una de las consultas en el ciclo for (variable states).

[2020-09-29T02: 04: 28.585Z] @ firebase / database: FIREBASE ADVERTENCIA: uso de un índice no especificado. Sus datos se descargarán y filtrarán en el cliente. Considere agregar ".indexOn": "end" en / Alerts / BR / RR a sus reglas de seguridad para un mejor rendimiento.

He buscado mucho sobre cómo establecer reglas en la base de datos de Firebase, pero no pude poner las reglas en funcionamiento. En mi base de datos, estoy recorriendo países y estados y por eso usé comodines ($coutry y $state)

{
  /* Visit https://firebase.google.com/docs/database/security to learn more about security rules. */
  "rules": {
    ".read": "auth != null",
    ".write": "auth != null",
    "Alerts": {
      "$country": {
        "Sstate": {
          ".indexOn": ["end"]
        }
      }
    }
  }
}

Mi función funciona y los datos se eliminan como se esperaba, pero las advertencias siguen apareciendo.

exports.closeAnnouncementsBRTZ3 = functions.pubsub
.schedule('10 0 * * *')
.timeZone('America/Sao_Paulo') // Users can choose timezone - default is America/Los_Angeles
.onRun((context) => {

  const expireTime = 1601251200000;

  const ref = admin.database().ref().child('Alerts').child('BR');
  
  const states = ['AC', 'AM', 'MS', 'MT', 'RO', 'RR'];
  
  return Promise.all(states.map(async (state) => {
    return await ref.child(state).orderByChild('end').endAt(expireTime).once('value', (dataSnapshot) => {
      console.log('await dataSnapshot: ', state);
      if (dataSnapshot.val() !== null) {
        dataSnapshot.forEach(childSnapshot => {
          console.log('child to be removed: ', childSnapshot.key);
          childSnapshot.ref.remove();
        });
      }
    });
  }));
  
});

Entonces, ¿cómo establecer las reglas correctamente de manera que mejore el rendimiento de mis consultas y sin advertencias?

1
Aliton Oliveira 29 sep. 2020 a las 06:10

2 respuestas

La mejor respuesta

Lo solucioné agregando ".indexOn": "end" en cada uno de los nodos, aunque hay algunos nodos que aún no existen.

{
  /* Visit https://firebase.google.com/docs/database/security to learn more about security rules. */
  "rules": {
    ".read": "auth != null",
    ".write": "auth != null",
    "Alerts": {
      "BR": {
        "AC": {
          ".indexOn": ["end"]
        },
        "AM": {
          ".indexOn": ["end"]
        },
        "MS": {
          ".indexOn": ["end"]
        },
        "MT": {
          ".indexOn": ["end"]
        },
        "RO": {
          ".indexOn": ["end"]
        },
        "RR": {
          ".indexOn": ["end"]
        }
      }
    }
  }
}

No es una forma conveniente de resolverlo, porque tenemos que establecer la regla para cada posible nodo en nuestro proyecto. Pero una vez que está hecho ... ¡está hecho!

0
Aliton Oliveira 30 sep. 2020 a las 21:33

De hecho, sus consultas funcionarán y es posible que ni siquiera sienta el problema de rendimiento, en caso de que su aplicación no tenga muchos datos en este momento, sin embargo, de hecho, el uso de comodines podría afectar su rendimiento y un index podría ayudarlo , ya que no dependerá de que se filtre y ejecute en el lado del cliente.

Sin embargo, como se aclara en el comentario de esta pregunta aquí, proporcionado por Firebase Engineer, no es posible configurar un índice comodín , lamentablemente. Como se indica en este caso, aquí, cambiando la estructura de su base de datos lo ayudaría a resolver este problema, ya que la modela de manera que pueda usar índices fácilmente y mejorar su rendimiento.

Para resumir, necesitaría cambiar la estructura de su base de datos para que tenga un rendimiento mejorado, ya que los índices no funcionan con comodines como lo está haciendo.

1
gso_gabriel 29 sep. 2020 a las 06:50