removed query orderbykey only new limittolast last item child_added child added javascript firebase firebase-realtime-database

javascript - query - orderbykey firebase



orderByChild no funciona en Firebase (4)

Cuando llama a snapshot.val() , está recuperando un objeto JSON. El orden de las claves en un objeto JSON está determinado por su navegador y no por Firebase.

Para poner en orden a los niños:

self.getAllProfiles = function () { var qProfile = $q.defer(); var ref = new Firebase(FBURL); ref.child("users").orderByChild(''last_update'').on("value", function (snapshot) { snapshot.forEach(function(child) { console.log(child.val()) // NOW THE CHILDREN PRINT IN ORDER }); qProfile.resolve(snapshot.val()); }, function (errorObject) { qProfile.reject(errorObject); }); return qProfile.promise; };

Puede dejar la llamada q.resolve() donde está: snapshot.forEach() no es una llamada asíncrona.

Estoy intentando consultar mi base de datos para que recupere una lista ordenada basada en una clave secundaria. Lo hago de la siguiente manera (ver a continuación), pero no pasa nada, lo que significa que devuelve un objeto ordenado exactamente de la misma manera que se almacena en la base de datos de Firebase. Que esta pasando?

self.getAllProfiles = function () { var qProfile = $q.defer(); var ref = new Firebase(FBURL); ref.child("users").orderByChild(''last_update'').on("value", function (snapshot) { console.log(snapshot.val()) // HERE IS WHERE IT SHOULD BE ORDERED qProfile.resolve(snapshot.val()); }, function (errorObject) { qProfile.reject(errorObject); }); return qProfile.promise; };

Para agregar, mi nodo de usuarios se ve como sigue:

users /$username /last_update /id /data /profile_image /display_name

Aquí hay una instantánea:

Tester: Object github: Object last_update: 1447732462170 userId: "github:12345"


Luché con el mismo problema en iOS. Si convierte una instantánea en un objeto NSDictionary, se convierte en una lista desordenada. Versión Objective-C en caso de necesidad:

[[self.refChild queryOrderedByChild:@"date_created"] observeEventType:FIRDataEventTypeValue withBlock:^(FIRDataSnapshot * _Nonnull snapshot) { for (FIRDataSnapshot *child in snapshot.children) { NSDictionary *anObject = child.value; NSString *aKey = child.key; } }];


Para ordenar usando el detector de eventos de value :

firebase.database().ref(''/invoices'').orderByChild(''name'').on(''value'', snapshot => { snapshot.forEach(child => { console.log(child.key, child.val()); }); }

Si quieres revertir el orden, prueba:

function reverseSnapshotOrder (snapshot) { let reversed = []; snapshot.forEach(child => { reversed.unshift(child); }); return reversed; } reverseSnapshotOrder(snapshot).forEach(child => { console.log(child.key, child.val()); });

Consulte: firebase.google.com/docs/database/web/…


Sé que esta pregunta ha sido respondida y tiene más de 1 año, pero como todavía hay algo de confusión en la sección de comentarios, me gustaría agregar algo de información.

El problema

El problema original es que el OP desea recuperar una lista ordenada basada en una clave secundaria de la base de datos en tiempo real de Firebase, pero .orderByChild(''arg'') no funciona como se esperaba.

Pero lo que no funcionó como se esperaba no es .orderByChild(''arg'') , sino .on("value", callback) . Porque .on("value", callback) funciona un poco diferente de otros eventTypes como .on("child_added", callback) .

Ejemplo

Digamos que tenemos una base de datos de base de fuego en tiempo real como se muestra a continuación:

{ myData: { -KYNMmYHrzLcL-OVGiTU: { NO: 1, image: ... }, -KYNMwNIz4ObdKJ7AGAL: { NO: 2, image: ... }, -KYNNEDkLpuwqQHSEGhw: { NO: 3, image: ... }, } }

-

Si usamos .on("value", callback) , la devolución de llamada () se llamará una vez y devolverá una matriz de objetos de 3 objetos.

ref.on("value", function(snapshot) { console.log(snapshot.val()); // Please see Frank van Puffelen''s answer }

-

Si usamos .on("child_added", callback) , la devolución de llamada () se llamará 3 veces, cada vez que se devuelva un objeto, y se devolverán en orden .

ref.once("child_added", function(snapshot) { console.log(snapshot.val()); // The objects are returned in order, do whatever you like }

Conclusión

Si solo necesita obtener los datos solicitados desde la base de fuego (por ejemplo, para inicializar la interfaz de usuario), entonces ref.orderByChild(''arg'').once("child_added", callback) conviene, es simple y fácil de usar.

Sin embargo, si por alguna razón necesita usar ref.orderByChild(''arg'').on("value", callback) , consulte la respuesta de Frank van Puffelen.

Referencia

Lea el documento de Firebase para obtener más información sobre on(eventType, callback, cancelCallbackOrContext, context) , sus argumentos y sus valores de retorno.

Otro documento útil: trabajar con listas de datos en la web.