Empresas
Empleos
  • Sobre nosotros
  • Soluciones
    • Publicación de vacantes
      Publica tu vacante y recibe candidatos calificados en 48h.
    • Evaluación de candidatos
      500+ pruebas técnicas y psicológicas, más anti-fraude.
    • Headhunting
      Búsqueda ejecutiva a la medida de principio a fin.
    • Nómina + EOR
      Dispersión de nómina y EOR en más de 15 países de LATAM.
  • Precios
  • Empleos

0

371
Vistas
Cómo revertir la marca de tiempo para ordenar documentos por último en firestore

(( SOLUCIONADO ))

Buscando ayuda para resolver esta rareza, primero soy nuevo en JS y Firebase, por lo que podría estar perdiéndome lo obvio aquí. En cualquier caso, estoy tratando de convertir la marca de tiempo en un número negativo, para ordenar documentos y obtener siempre los últimos 10 si los limito en una llamada de consulta.

Sin embargo, el siguiente código genera un error al intentar ejecutarlo en Cloud Functions.

Sin embargo, si consola. registro el lado del cliente (-Math.abs (marca de tiempo)), obtengo un número negativo muy bien. ¿Alguien aquí para ayudar con este problema y / o proporcionar una solución?

 // create welcome post on new user signup exports.createWelcomePost = functions.auth.user().onCreate((user) => { const uid = user.uid; const userName = user.displayName; const photoURL = user.photoURL; const timestamp = admin.firestore.FieldValue.serverTimestamp(); const order = -Math.abs(timestamp); const db = admin.firestore(); const docRef = db.collection('posts'); docRef.add({ order: order, created: timestamp, createdBy: uid, userName: displayName, userImage: photoURL, content: "...just joined the Startly Community, let's give him a warm welcome!", featuredImage: "assets/img/welcome_post.jpg" }) .then((docRef) => { console.log("Welcome post created with ID: ", docRef.id); }) .catch((error) => { console.error("Error creating post: ", error); }); // ... });
over 4 years ago · Santiago Trujillo
2 Respuestas
Responde la pregunta

0

Como se explica en el documento , serverTimestamp devuelve un centinela que se usa con set() o update() para incluir una marca de tiempo generada por el servidor en los datos escritos.

El término centinela significa que el valor exacto se calcula en el back-end, es decir, en la plataforma de Firestore cuando el documento se escribe en Firestore . Es por eso que no puede usar este valor con, por ejemplo -Math.abs() .

La ventaja de usar serverTimestamp en lugar de un valor de marca de tiempo generado en el cliente (por ejemplo Date.now() ) es que el valor es independiente de la configuración y las zonas horarias de las computadoras de los usuarios. Siempre se tendrá en cuenta la hora del servidor.


En conclusión, debe mantener el valor de la timestamp de tiempo de la forma en que lo define, eliminar el campo de order y, al consultar, usar .orderBy("created", "desc") como se explica en la respuesta de Dharmaraj.

over 4 years ago · Santiago Trujillo Denunciar

0

Si agrega una marca de tiempo UNIX (o serverTimestamp) en su documento, debería poder ordenarlos en orden descendente.

 db.collection("posts") .orderBy("created", "desc") .limit(10) .get()

Esta consulta debe obtener los 10 últimos documentos, es decir, ordena los documentos por el valor del campo creado en orden descendente y se limita a los 10 primeros resultados.

Mientras agrega el documento, puede agregar la marca de tiempo de esta manera:

 const timestamp = Date.now() docRef.add({ created: timestamp, ...otherFields })

Puede usar serverTimestamp en sí mismo, ya que tiene varios beneficios sobre Date.now() como lo explica @Renaud. Cuando obtenga el documento, ese campo created será un objeto de la siguiente manera:

 { created: { seconds: 1627370100, nanoseconds: 0 } }

Luego puede usar el método toDate para convertirlo en una fecha de Javascript.

 const {created} = snapshot.val() console.log(created.toDate()) // JS Date object console.log(Date.parse(created.toDate())) // Timestamp in milliseconds

Fuera de tema, pero debe devolver promesas en una función en la nube, así que agregue una palabra clave de retorno:

 return docRef.add({}).then(() => { ^^^^^^ console.log("Doc added") return }).catch((e) => { console.log(e) return null })
over 4 years ago · Santiago Trujillo Denunciar
Responde la pregunta
Encuentra empleos remotos

¡Descubre la nueva forma de encontrar empleo!

Top de empleos
Top categorías de empleo
Empresas
Publicar vacante Precios Comercial
Legal
Términos y condiciones Política de privacidad
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Recomiéndame algunas ofertas
Necesito ayuda