En Firebase, ¿cómo puedo consultar los 10 nodos hijos más recientes?

Estoy usando childByAutoId() para generar mis hijos. Cada niño se ve así:

 { user_id: 1 } 

Me gustaría obtener los últimos 10 agregados recientemente, ordenados por tiempo DESC. ¿Cuál es la forma más fácil de hacer esto?

La respuesta es que debe usar un poco de lógica inversa, y también almacenar una clave de fecha y hora: par de valores dentro de cada nodo como un valor negativo. Omití el user_id: 1 para mantener la respuesta más limpia.

Aquí está la estructura de Firebase

 "test" : { "-KFUR91fso4dEKnm3RIF" : { "timestamp" : -1.46081635550362E12 }, "-KFUR9YH5QSCTRWEzZLr" : { "timestamp" : -1.460816357590991E12 }, "-KFURA4H60DbQ1MbrFC1" : { "timestamp" : -1.460816359767055E12 }, "-KFURAh15i-sWD47RFka" : { "timestamp" : -1.460816362311195E12 }, "-KFURBHuE7Z5ZvkY9mlS" : { "timestamp" : -1.460816364735218E12 } } 

y así es como está escrito para Firebase; Acabo de utilizar un IBAction para un botón para escribir algunos nodos:

 let testRef = self.myRootRef.childByAppendingPath("test") let keyRef = testRef.childByAutoId() let nodeRef = keyRef.childByAppendingPath("timestamp") let t1 = Timestamp nodeRef.setValue( 0 - t1) //note the negative value 

y el código para leerlo en

  let ref = self.myRootRef.childByAppendingPath("test") ref.queryOrderedByChild("timestamp").queryLimitedToFirst(3).observeEventType(.ChildAdded, withBlock: { snapshot in print("The key: \(snapshot.key)") //the key }) 

y he declarado una pequeña función para devolver la marca de tiempo actual

 var Timestamp: NSTimeInterval { return NSDate().timeIntervalSince1970 * 1000 } 

y la salida

 The key: -KFURBHuE7Z5ZvkY9mlS The key: -KFURAh15i-sWD47RFka The key: -KFURA4H60DbQ1MbrFC1 

Como puede ver, están en orden inverso.

Cosas a tener en cuenta:

  1. Escribir su marca de tiempo como valores negativos
  2. Cuando lee en uso .queryLimitedToFirst en vez de last.

En ese sentido, también puede simplemente leer los datos como de costumbre y agregarlos a una matriz, luego ordenar la matriz descendente. Eso pone más esfuerzo en el cliente y si tiene 10,000 nodos, puede que no sea una buena solución.

Supongo que tus datos realmente se ven así:

 someDataSet: { longUID-1: { timeCreated: 9999999999, // (seconds since the javascript epoch) user_id: 1 }, longUID-2: { timeCreated: 1111111111, user_id: 2 }, longUID-3: { timeCreated: 3141592653, user_id: 3 } } 

Puede automatizarlo llamando Firebase.push({user_id: ###, timeCreated: ###}) varias veces en un ciclo for o cualquier otro método. Tal vez esté agregando noticias a una página web, pero solo quiere que su usuario vea las historias más recientes — IDK. Pero la respuesta a tu pregunta es usar ref.orderByChild() y ref.limitToLast() .

 var ref = new Firebase(".firebaseio.com/someDataSet"); //the "/someDataSet" comes from the arbitrary name that I used up above var sortedRef = ref.orderByChild('timeCreated'); //sort them by timeCreated, ascending sortedRef.limitToLast(2).on("child_added", function(snapshot){ var data = snapshot.val(); console.log(data); /* do something else with the data */ }); //The console would look like this // Object {timeCreated: 9999999999, user_id: 1} // Object {timeCreated: 3141592653, user_id: 3} 

Esto sucedió porque el progtwig tomó al niño con el mayor valor timeCreated primero y luego el segundo valor mayor (segundo) … También tenga en cuenta que longUID no significa nada cuando usted los ordena por niño y tampoco lo hacen los otros valores (user_id en este caso) )

Aquí está la documentación para:

  • Método .push () de Firebase (lo siento, no tengo permiso para publicar este enlace, no tengo suficiente reputación)
  • Método Firebase .orderByChild
  • Y también, el método Firebase .limitToLast

El código: ref.queryOrderedByKey().queryLimitedToLast(10) se puede usar para obtener los 10 datos más recientes. Sin embargo, este es un orden ascendente por defecto.

Alternativamente, puede ordenar sus datos a través de

 ref.orderByChild("id").on("child_added", function(snapshot) { console.log(snapshot.key()); }); 

Esto también presenta un orden ascendente por defecto. Cambiarlo a un orden descendente es un poco complicado. Lo que sugeriría es que multiplique los identificadores por -1 como se muestra a continuación y luego ordenarlos.

 var ref= new Firebase("your data"); ref.once("value", function(allDataSnapshot) { allDataSnapshot.forEach(function(dataSnapshot) { var updatedkey = -1 * dataSnapshot.key(); ref.update({ element: { id: updatedkey}}); }); }); 

Estas dos páginas de SO también pueden serle útiles, compruebe:

¿Cómo eliminar todos los hijos X menos los más recientes en un nodo de Firebase?

firebaseArray orden descendente?