Estoy implementando un chat usando Firebase Realtime DB . Hay un requisito, que algunas salas de chat pueden mostrar mensajes nuevos de forma predeterminada, pero los mensajes en diferentes salas de chat deben aprobarse primero antes de mostrarlos.
La estructura de la base de datos en Firebase está anidada así:
/chat/$roomID/$messageID/y cada objeto de mensaje está estructurado de la siguiente manera:
{ user: string content: string isApproved: boolean clientStamp: number // client-side unix timestamp serverStamp: number // server-side unix timestamp, via `firebase.database.ServerValue.TIMESTAMP` } Tener solo las salas de chat de visualización predeterminada sería fácil: ordenaría los datos por serverStamp :
let query = DBConn.ref('chat/' + roomID).orderByChild('serverStamp').limitToLast(50); query.on("value", snapshot => { // set the list of messages to display this.appendSnapshot(snapshot); }); Sin embargo, la regla de aprobar primero dificulta este enfoque. La solución obvia sería mostrar solo los mensajes con el atributo isApproved establecido en true . Pero si consultara los últimos N mensajes ordenados por marca de tiempo y alguien publicara N mensajes no aprobados, eso eliminaría cualquiera de los mensajes aprobados del resultado de la consulta y el chat estaría vacío. Realtime DB tiene la siguiente limitación, lo que hace que sea imposible realizar consultas tanto por marca de tiempo + isApproved :
Solo puede usar un método de ordenar a la vez
Así que ahora mismo lo estoy solucionando de la siguiente manera:
clientStamp (marca de tiempo de Unix del lado del cliente) en lugar de serverStampclientStamp por dos, lo que significa que estos nuevos mensajes nunca eliminarán los mensajes anteriores ya aprobados del resultado de la consulta (ya que su marca de tiempo tiene un valor más alto)clientStamp se establece en un valor de firebase.database.ServerValue.TIMESTAMP (hora del servidor), lo que lo empuja a la parte superior de la consulta de chat ( orderByChild('serverStamp') )... pero esto es más bien una solución rápida. ¿Hay alguna manera de hacer que esto funcione bien tanto para las salas de chat de mostrar por defecto como para aprobar primero?
Me gusta su enfoque al establecer la marca de tiempo como parte de un flujo de aprobación. 👍
La solución más común es la que documenté en Query basada en múltiples cláusulas where en Firebase
Aquí, eso significaría que tiene una propiedad isApproved_serverStamp donde almacena los valores combinados de las propiedades isApproved y serverStamp , como true_1632065222747 . A continuación, puede consultar los mensajes aprobados más recientes con:
DBConn.ref('chat/' + roomID).orderByChild('isApproved_serverStamp').startAt("true_").limitToLast(50)