Estoy creando una aplicación de redes sociales (muy simple) y quiero almacenar la actividad del usuario en la base de datos de Firestore. Tengo una colección de "usuarios" y mantengo la identificación del usuario, el nombre de usuario del usuario, la foto de perfil del usuario allí. Pero no creo que la actividad del usuario deba almacenarse allí también (¿corríjame si me equivoco?)
Así que creé una nueva colección llamada UserActivity donde almaceno la actividad del usuario. Quería almacenar si un usuario ha estado buscando en un perfil, así que hago lo siguiente:
const logUserSearch = async (term) => { await firebase .firestore() .collection("userActivity") .doc(firebase.auth().currentUser.uid) .collection("userSearch") .add({ term: term, date: firebase.firestore.FieldValue.serverTimestamp(), }) };Creo que la consulta anterior resuelve el problema con los términos de búsqueda del usuario. Sin embargo, quiero almacenar si un usuario ha visitado un perfil. Así que aquí está mi pregunta: ¿cuál es la forma correcta de almacenar si un usuario visitó un perfil? ¿Debería agregar una nueva subcolección "profileVisit", algo así:
const logProfileVisit = async (searchTerm, profileId) => { await firebase .firestore() .collection("userActivity") .doc(firebase.auth().currentUser.uid) .collection("profileVisit") .doc(profileId) .add({ source: searchTerm, date: firebase.firestore.FieldValue.serverTimestamp(), }) };Pero entonces, ¿cómo calculo cuáles son los perfiles más "populares"? ¿Debo crear mi base de datos de otra manera, así:
const logProfileVisit = async (searchTerm, profileId) => { await firebase .firestore() .collection("userActivity") .doc(profileId) .collection("profileVisit") .add({ user: firebase.auth().currentUser.uid source: searchTerm, date: firebase.firestore.FieldValue.serverTimestamp(), }) };¿Para que pueda calcular fácilmente cuáles son los perfiles más "populares"? ¿Qué pasa con el caso de usuario en el que necesito calcular "los 10 mejores perfiles de fans" o algo similar? Es decir, ¿cómo calculo quién visitó tu perfil con más frecuencia?
Una colección de nivel raíz "userActivity" (o una subcolección) debería ser suficiente. Puede almacenar el tipo de actividad como un campo en lugar de subcolecciones como se muestra a continuación:
users -> {userId} -> userActivity -> {logId} (col) (doc) (col) (doc)Pero entonces, ¿cómo calculo cuáles son los perfiles más "populares"?
Puede almacenar un campo numérico en el documento de ese perfil y cada vez que se llame a logProfileVisit , incremente eso:
const usersCol = firebase.firestore().collection("users") const logProfileVisit = async (searchTerm, profileId) => { await Promise.all([ usersCol .doc(currentUserId) .collection("userActivity") .add({ source: searchTerm, date: firebase.firestore.FieldValue.serverTimestamp(), type: "profileVisit" }), usersCol .doc(profileUserId) .update({ profileViews: firebase.firestore.FieldValue.increment(1), }) ]) };También puede usar escrituras por lotes mientras actualiza estos campos para que ambas operaciones fallen o pasen.