¿Hay alguna manera de agregar campos created_at y updated_at a un esquema de mangosta, sin tener que pasarlos cada vez que se llama a MyModel ()?
El campo created_at sería una fecha y solo se agregará cuando se cree un documento. El campo updated_at se actualizará con una nueva fecha cada vez que se llame a save () en un documento.
He intentado esto en mi esquema, pero el campo no aparece a menos que lo agregue explícitamente:
var ItemSchema = new Schema({
name : { type: String, required: true, trim: true }
, created_at : { type: Date, required: true, default: Date.now }
});

Respuestas:
A partir de Mongoose 4.0 ahora puede establecer una opción de marcas de tiempo en el Esquema para que Mongoose maneje esto por usted:
Puede cambiar el nombre de los campos utilizados así:
http://mongoosejs.com/docs/guide.html#timestamps
fuente
ACTUALIZACIÓN: (5 años después)
ACTUALIZACIÓN: (4 años después)
Si lo usa
ObjectIdcomo su_idcampo (que suele ser el caso), entonces todo lo que necesita hacer es:Verifique mi respuesta original a continuación sobre cómo obtener la marca de tiempo creada desde el
_idcampo. Si necesita usar ID de un sistema externo, verifique la respuesta de Roman Rhrn Nesterov.ACTUALIZAR: (2.5 años después)
Ahora puede usar la opción # timestamps con la versión de mangosta> = 4.0.
Si establece marcas de tiempo, asignaciones de mangosta
createdAtyupdatedAtcampos en su esquema, el tipo asignado esDate.También puede especificar los nombres de los archivos de marca de tiempo:
RESPUESTA ORIGINAL:
Si está utilizando ObjectId como su campo de identidad, no necesita el
created_atcampo. Los ObjectIds tienen un método llamadogetTimestamp().ObjectId ("507c7f79bcf86cd7994f6c0e"). GetTimestamp ()Esto devolverá el siguiente resultado:
ISODate ("2012-10-15T21: 26: 17Z")Más información aquí ¿Cómo extraigo la fecha de creación de un Object ID de Mongo?
Para agregar
updated_atarchivado, debe usar esto:fuente
Esto es lo que terminé haciendo:
fuente
getTimestamp()Date.now()siempre que sea posible en lugar denew Datesu más rápido, ya que es un método estáticoUse la
timestampsopción integrada para su esquema.Esto agregará automáticamente
createdAtyupdatedAtcampos a su esquema.http://mongoosejs.com/docs/guide.html#timestamps
fuente
updatedAtse actualiza en cada nuevo guardado (cuando se cambia el obj)Si usa
update()ofindOneAndUpdate()con
{upsert: true}opciónpuedes usar
$setOnInsertfuente
_idcampo predeterminado de Mogo , entonces no necesita uncreatedAtcampo. Consulte mi respuesta a continuación para obtener más detalles.Agregue
timestampsa suSchemagusto asícreatedAtyupdatedAtgenerará automáticamente para ustedTambién puedes cambiar
createdAt -> created_atporfuente
Así es como logré haber creado y actualizado.
Dentro de mi esquema, agregué lo creado y actualizado así:
/ ** * Esquema del artículo * / var ArticleSchema = nuevo esquema ({ creado: { tipo: Fecha, predeterminado: Date.now }, actualizado: { tipo: Fecha, predeterminado: Date.now }, título: { tipo: cadena, defecto: '', ajuste: verdadero, requerido: 'El título no puede estar en blanco' }, contenido: { tipo: cadena, defecto: '', ajuste: verdadero }, usuario: { tipo: Schema.ObjectId, ref: 'Usuario' } });Luego, en mi método de actualización del artículo dentro del controlador del artículo, agregué:
/ ** * Actualizar un artículo * / export.update = function (req, res) { artículo var = req.article; artículo = _.extend (artículo, req.body); article.set ("actualizado", Date.now ()); article.save (function (err) { si (err) { return res.status (400) .send ({ mensaje: errorHandler.getErrorMessage (err) }); } más { res.json (artículo); } }); };Las secciones en negrita son las partes de interés.
fuente
Documentos: https://mongoosejs.com/docs/guide.html#timestamps
fuente
Puede usar el
timestampcomplemento demongoose-trooppara agregar este comportamiento a cualquier esquema.fuente
Puede usar este complemento muy fácilmente. De los documentos:
Y también establezca el nombre de los campos si lo desea:
fuente
podemos lograr esto usando el complemento de esquema también.
En
helpers/schemaPlugin.jsarchivoy en
models/ItemSchema.jsarchivo:fuente
En el esquema de su modelo, simplemente agregue las marcas de tiempo de un atributo y asigne un valor verdadero como se muestra:
fuente
Ahora puede usar esto, para que no sea necesario incluir esta opción en cada tabla
fuente
Mi versión de mangosta es 4.10.2
Parece que solo el gancho
findOneAndUpdatees trabajofuente
Use una función para devolver el valor predeterminado calculado:
fuente
Date.now()en una función acaba de hacer:...default: Date.now()default: Date.now()estaría mal. Si algo es asídefault: Date.now. De lo contrario, todos sus documentos tendrán la misma marca de tiempo: la hora en que se inició su solicitud;)default: Date.nowestrategia Mucho más limpio.Realmente hago esto en la parte de atrás
Si todo va bien con la actualización:
fuente
Use machinepack-datetime para formatear la fecha y hora.
El paquete de máquina es excelente con una API clara a diferencia del mundo Javascript expreso o general.
fuente
Puede usar middleware y virtuales . Aquí hay un ejemplo para su
updated_atcampo:fuente
name. Y sí, debería ser persistente.