¿Cómo recorro esta database y obtengo los valores secundarios?

Tengo esta database, que se parece a esto enter image description here

así que las primeras keys son usuario uid tomado de auth, y luego se toma el nombre de usuario que él / ella proporcionó y lo que anotaron para cada partido también.

Solo quería get puntos totales de cada usuario, por ejemplo, el total de puntos de Ray es 45 y el total de puntos de Wood es 44, pero después de revisar los documentos todo lo que pude hacer fue solo para un usuario, tengo que escribir cada nombre de usuario y la coincidencia específica para cada línea para get el valor … ahora piense en cómo será si son docenas de usuarios? Hmm muchas líneas …

aquí está el JSON

el código de javascript

var query = firebase.database().ref(); query.once("value") .then(function(snapshot) { snapshot.forEach(function(childSnapshot) { var key = childSnapshot.key; var Data1 = childSnapshot.child("Ray/Match1/Points").val(); var Data2 = childSnapshot.child("Ray/Match2/Points").val(); console.log(Data1 + Data2); }); }) 

que me permitirá mostrar, puntos totales de Ray, pero no para Wood, obviamente tengo que repetirlo y escribirlo …

Entonces, ¿cómo soluciono esto?

Eché un vistazo a su problema y creo que tengo su solución, o al less una Vía de acceso a su solución. Ok, primero explicaré el problema básico, luego intentaré proporcionarle un código genérico (intentaré usar algunas de las variables que usó). ¡Y allá vamos!

Básicamente lo que veo son 2 pasos …

PASO 1: debe usar una "function de constructor" que creará nuevos objects de usuario con su propio nombre (y / o ID de usuario) y su propio set de properties.

Con esa línea de pensamiento, puede hacer que la function constructora incluya properties como "nombre de usuario", "puntos de coincidencia 1", "puntos de coincidencia 2" y luego una function que registra el resumen de cada nombre y el total de puntos de coincidencia puntos 1 y 2.

PASO 2: debe colocar la function de constructor dentro de un bucle que pasará por la database buscando las properties específicas que necesita para completar las properties que necesita la function constructora para escupir la información que está buscando.

Entonces … y tomemos una respiración profunda porque fueron muchas palabras … intentemos codificar eso. Usaré properties genéricas de una manera que creo que le facilitará insert sus propios nombres de properties / variables.

 var user = function(name, match1, match2){ this.name = name; this.match1 = match1; this.match2 = match2; this.pointTotal = function(match1, match2) { console.log(match1 + match2);}; this.summary = function(){ console.log(name + " has a total of " + pointTotal + " points.");}; } 

la parte "Esta" del código permite usar CUALQUIER nombre de usuario y no solo los específicos.

Ok, entonces el código anterior se ocupa de la function de constructor como parte del problema. Ahora no importa cuántos usuarios necesite crear con nombres únicos.

El siguiente paso es crear algún tipo de function de bucle que recorra la database y complete las properties necesarias para crear cada usuario, de modo que pueda get el total de puntos de CADA usuario y no solo uno.

Nuevamente, usaré los nombres de propiedad / variable generics-ish …

 var key = childSnapshot.key; while(i = 0; i < key.length + 1; i++) { var user = function(name, match1, match2){ this.name = name; this.match1 = match1; this.match2 = match2; this.pointTotal = function(match1, match2) { console.log(match1 + match2);}; this.summary = function(){ console.log(name + " has a total of " + pointTotal + " points.");}; } } 

Eso es un montón de palabras y el código es un híbrido de nombres / variables de properties genéricas y de nombres / variables de propiedad que usted usa, pero estoy seguro de que estoy en la ruta correcta.

Confío mucho en que si utilizó el código y la EXPLICACIÓN que proporcioné, si inserta sus propias variables obtendrá la solución que necesita.

Para terminar, solo quiero decir que REALMENTE espero que eso ayude y, de no ser así, me gustaría ayudar a resolver el problema de una forma u otra porque necesito la práctica. Trabajo un trabajo con horas extrañas y, por lo tanto, si no respondo de inmediato, es probable que esté en mi trabajo 🙁

¡Buena suerte y espero haber ayudado!

simplemente agrega el nodo total a tu database

 |_Id |_ $userId: | |_ Ray | | |_ Match1:24 | | |_ Match2:21 | |_ total:45 

y luego get el total del usuario

 var query = firebase.database().ref(); query.once("value") .then(function(snapshot) { snapshot.forEach(function(childSnapshot) { var total = childSnapshot.child("total").val(); console.log(total); }); }) 

puedes agregar el nodo total usando las funciones de la nube

Mira esta implementación. No es necesario para la function de nube.

  firebase().database().ref().on('value', function(snapshot) { snapshot.forEach((user)=>{ user.forEach((matches)=> { var total = 0; matches.forEach((match)=> { total += match.val().Points; }); console.log(total); }); }); }) 

Si la key es la Id del usuario, ¿por qué agregar otro object nested con el nombre del usuario? ¿Esperas que un usuario tenga múltiples nombres de usuario? Eso suena raro y agrega complejidad, como probablemente habrás notado. Si necesita mantener el nombre de usuario en alguna parte de Firebase, se recomienda que dedique una sección de detalles del usuario en algún lugar directamente debajo de la key de identificación del usuario. Aquí hay una representación de JavaScript de la estructura de objects de Firebase:

 { a1230scfkls1240: { userinfo: { username: 'Joe' }, matches: { asflk12405: { points: 123 }, isdf534853: { points: 345 } } } } 

Ahora, llegar al total de puntos parece un poco más directo, ¿no es así? 😎

Para ayudarlo sin modificar su estructura de database actual, todo lo que necesita es recorrer todo el userId + nombre de usuario + coincide con la permutación en su database. Aquí hay un código de ejemplo para lograr eso, no necesitas ninguna característica especial de Firebase, solo un buen bucle for-of de JavaScript:

 const query = firebase.database().ref(); query.once('value') .then(snapshot => { const points = {} const users = snapshot.val() for (const userId of Object.keys(users)) { const userprofile = users[userId] for (const username of Object.keys(userprofile)) { const user = userprofile[username] for (const matchId of Object.keys(user)) { const match = user[matchId] // Store the points per user, per profile, or per both, depending on your needs points[username] = points[username] === undefined ? points[username] = match.points : points[username] += match.points } } } })