254 votes

ajouter les champs created_at et updated_at aux schémas mongoose

Existe-t-il un moyen d'ajouter created_at et updated_at à un schéma de la mangouste, sans avoir à les transmettre à chaque fois qu'une nouvelle MyModel() s'appelle ?

Le site created_at serait une date et ne serait ajouté que lorsqu'un document est créé. Le site updated_at sera mis à jour avec la nouvelle date chaque fois que save() est appelé sur un document.

J'ai essayé de le faire dans mon schéma, mais le champ n'apparaît pas à moins que je ne l'ajoute explicitement :

var ItemSchema = new Schema({
    name    : { type: String, required: true, trim: true },
    created_at    : { type: Date, required: true, default: Date.now }
});

31voto

Si vous utilisez update() ou findOneAndUpdate()

avec {upsert: true} option

vous pouvez utiliser $setOnInsert

var update = {
  updatedAt: new Date(),
  $setOnInsert: {
    createdAt: new Date()
  }
};

17voto

Kaveh Naseri Points 63

Dans votre model :

const User = Schema(
  {
    firstName: { type: String, required: true },
    lastName: { type: String, required: true },
    password: { type: String, required: true }
  },
  {
    timestamps: true
  }
);

Et après ça, votre model en collection serait comme ceci :

{
    "_id" : ObjectId("5fca632621100c230ce1fb4b"),
    "firstName" : "first",
    "lastName" : "last",
    "password" : "$2a$15$Btns/B28lYIlSIcgEKl9eOjxOnRjJdTaU6U2vP8jrn3DOAyvT.6xm",
    "createdAt" : ISODate("2020-12-04T16:26:14.585Z"),
    "updatedAt" : ISODate("2020-12-04T16:26:14.585Z"),
}

15voto

aamitarya Points 124

Pour NestJs avec Mongoose, utilisez ceci

@Schema({timestamps: true})

11voto

rOOb85 Points 133

C'est ainsi que j'ai réussi à avoir créé et mis à jour.

Dans mon schéma, j'ai ajouté le created et le updated comme suit :

   /\*\*
     \* Article Schema
     \*/
    var ArticleSchema = new Schema({
        **created: {
            type: Date,
            default: Date.now
        },
        updated: {
            type: Date,
            default: Date.now
        },**
        title: {
            type: String,
            default: '',
            trim: true,
            required: 'Title cannot be blank'
        },
        content: {
            type: String,
            default: '',
            trim: true
        },
        user: {
            type: Schema.ObjectId,
            ref: 'User'
        }
    });

Puis dans ma méthode de mise à jour de l'article à l'intérieur du contrôleur de l'article j'ai ajouté :

/\*\*
     \* Update a article
     \*/
    exports.update = function(req, res) {
        var article = req.article;

        article = \_.extend(article, req.body);
        **article.set("updated", Date.now());**

        article.save(function(err) {
            if (err) {
                return res.status(400).send({
                    message: errorHandler.getErrorMessage(err)
                });
            } else {
                res.json(article);
            }
        });
    };

Les sections en gras sont les parties qui nous intéressent.

9voto

Pavneet Kaur Points 11

Dans le schéma de votre modèle, il suffit d'ajouter un attribut timestamps et attribuer la valeur true comme indiqué : -

var ItemSchema = new Schema({
   name :  { type: String, required: true, trim: true },
},{timestamps : true}
);

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X