¿Qué tipo de esquema en Mongoose es mejor para la marca de tiempo?

83

Estoy usando Mongoose, MongoDB y Node.

Me gustaría definir un esquema donde uno de sus campos sea una fecha / marca de tiempo.

Me gustaría usar este campo para devolver todos los registros que se han actualizado en los últimos 5 minutos.

Debido al hecho de que en Mongoose no puedo usar el método Timestamp (), entiendo que mi única opción es usar el siguiente método Javascript:

time : { type: Number, default: (new Date()).getTime() } 

Probablemente no sea la forma más eficiente de consultar una base de datos enorme. Realmente agradecería si alguien pudiera compartir una forma más eficiente de implementar esto.

¿Hay alguna forma de implementar esto con Mongoose y poder usar una marca de tiempo de MongoDB?

Liatz
fuente

Respuestas:

135

Edición - 20 de marzo de 2016

Mongoose ahora admite marcas de tiempo para colecciones .

Considere la respuesta de @bobbyz a continuación . Quizás esto es lo que estás buscando.

Respuesta original

Mongoose admite un Datetipo (que es básicamente una marca de tiempo):

time : { type : Date, default: Date.now }

Con la definición de campo anterior, cada vez que guarde un documento con un timecampo no establecido, Mongoose completará este campo con la hora actual.

Fuente: http://mongoosejs.com/docs/guide.html

Drinchev
fuente
Muchas gracias por la respuesta, pero lo que trato de entender es la mejor forma de consultar para devolver todos los registros que se han actualizado en los últimos 5 minutos. ¿Quiere decir que debería usar: date: {$ gt: ((Math.round ((new Date ()). GetTime () / 1000)) - 300)}
Liatz
1
@ user1103897 puede construir un objeto Date directamente y usarlo con $ gt así: var now = new Date (); var fiveminago = nueva fecha (ahora.getTime () - 5 * 60 * 1000); luego consulta con {date: {$ gt: fiveminago}}
mpobrien
19
Probablemente debería ser en Date.nowlugar de Date.now().
Aleksei Zabrodskii
1
+1 elmigranto, el ejemplo de documentos de Mongoose usa Date.now mongoosejs.com/docs/guide.html
Aaron
19
Explicación: Date.nowporque Date.nowes una función que se ejecutará al crear objetos. Date.now()es la fecha en la que models.jsse analizó. Es decir, si usas Date.now()todos tus objetos tendrán la misma fecha, y esa será la fecha en que models.jsse analizó.
Mikemaccana
116

La versión actual de Mongoose (v4.x) tiene marcas de tiempo como una opción incorporada a un esquema:

var mySchema = new mongoose.Schema( {name: String}, {timestamps: true} );

Esta opción añade createdAty updatedAtpropiedades que son sellos de tiempo con una Date, y que hace todo el trabajo por usted. Cada vez que actualiza el documento, actualiza la updatedAtpropiedad. Documentos de marcas de tiempo de esquema.

bobbyz
fuente
4
Gracias, los documentos no tenían claro que se pudiera usar en timestamps: truelugar de anular los nombres usando timestamps: {...}.
Tar
2
@tar Supongo que todavía funciona, pero los documentos 4.x solían mencionar específicamente timestamps: true, por lo que es posible que se necesiten algunas consideraciones adicionales en el futuro. (¿Quizás lo están desaprobando? Tienes razón, los documentos no son muy claros para esta opción)
Bobbyz
14

En caso de que desee nombres personalizados para su createdAt y updatedAt

const mongoose = require('mongoose');  
const { Schema } = mongoose;

const schemaOptions = {
  timestamps: { createdAt: 'created_at', updatedAt: 'updated_at' },
};

const mySchema = new Schema({ name: String }, schemaOptions);
cegprakash
fuente
1
¡¡¡Gracias!!! Esto fue muy útil. Estaba buscando documentación pero no pude encontrar cómo hacer esto. Gracias nuevamente por compartir
Greg
6
var ItemSchema = new Schema({
    name : { type: String }
});

ItemSchema.set('timestamps', true); // this will add createdAt and updatedAt timestamps

Documentos: https://mongoosejs.com/docs/guide.html#timestamps

Nikolay_R
fuente
3
Podríamos simplemente pasar el { timestamps: true }segundo argumento new Schema({}, {<here>}).
jet_choong
0

Me gustaría usar este campo para devolver todos los registros que se han actualizado en los últimos 5 minutos.

Esto significa que debe actualizar la fecha a "ahora" cada vez que guarde el objeto. Tal vez encuentre esto útil: Complemento modificado para crear Moongoose

Fletch
fuente
-2

Primero : npm install mongoose-timestamp

Próximo: let Timestamps = require('mongoose-timestamp')

Próximo: let MySchema = new Schema

Próximo: MySchema.plugin(Timestamps)

Siguiente : const Collection = mongoose.model('Collection',MySchema)

Entonces puede usar el Collection.createdAto en Collection.updatedAtcualquier lugar que desee.

Creado en: Fecha de la semana Mes Fecha Año 00:00:00 GMT

El tiempo está en este formato.

shengsheng
fuente
Está integrado en Mongoose, así que evite el uso de complementos
Simon Dragsbæk