Existe-t-il un moyen d'ajouter des champs created_at et updated_at à un schéma mangouste, sans avoir à les passer à chaque fois que new MyModel () est appelé?
Le champ created_at serait une date et uniquement ajouté lors de la création d'un document. Le champ updated_at serait mis à jour avec une nouvelle date chaque fois que save () est appelé sur un document.
J'ai essayé cela dans mon schéma, mais le champ n'apparaît que si je l'ajoute expressément:
var ItemSchema = new Schema({
name : { type: String, required: true, trim: true }
, created_at : { type: Date, required: true, default: Date.now }
});
Réponses:
À partir de Mongoose 4.0, vous pouvez désormais définir une option d'horodatage sur le schéma pour que Mongoose gère cela pour vous:
Vous pouvez changer le nom des champs utilisés comme ceci:
http://mongoosejs.com/docs/guide.html#timestamps
la source
MISE À JOUR: (5 ans plus tard)
MISE À JOUR: (4 ans plus tard)
Si vous utilisez
ObjectId
comme_id
champ (ce qui est généralement le cas), tout ce que vous avez à faire est de:Vérifiez ma réponse originale ci-dessous pour savoir comment obtenir l'horodatage créé à partir du
_id
champ. Si vous devez utiliser des identifiants provenant d'un système externe, vérifiez la réponse de Roman Rhrn Nesterov.MISE À JOUR: (2,5 ans plus tard)
Vous pouvez maintenant utiliser l' option #timestamps avec la version mangouste> = 4.0.
Si vous définissez des horodatages, des assignations de mangouste
createdAt
et desupdatedAt
champs à votre schéma, le type attribué estDate
.Vous pouvez également spécifier les noms des fichiers d'horodatage:
RÉPONSE ORIGINALE:
Si vous utilisez ObjectId comme champ d'identité, vous n'avez pas besoin de
created_at
champ. Les ObjectIds ont une méthode appeléegetTimestamp()
.Cela renverra la sortie suivante:
Plus d'informations ici Comment extraire la date de création d'un objet Mongo ObjectID
Pour ajouter un
updated_at
fichier, vous devez utiliser ceci:la source
C'est ce que j'ai fini par faire:
la source
getTimestamp()
Date.now()
si possible au lieu denew Date
son plus rapide car il s'agit d'une méthode statiqueUtilisez l'
timestamps
option intégrée pour votre schéma.Cela ajoutera automatiquement des champs
createdAt
etupdatedAt
à votre schéma.http://mongoosejs.com/docs/guide.html#timestamps
la source
updatedAt
est mis à jour à chaque nouvelle sauvegarde (lorsque l'objet est modifié)Si vous utilisez
update()
oufindOneAndUpdate()
avec
{upsert: true}
optionvous pouvez utiliser
$setOnInsert
la source
_id
champ par défaut de Mogo , vous n'avez pas besoin d'uncreatedAt
champ. Vérifiez ma réponse ci-dessous pour plus de détails.Ajoutez
timestamps
à votreSchema
comme ceci alorscreatedAt
etupdatedAt
générera automatiquement pour vousVous pouvez également changer
createdAt -> created_at
parla source
C'est ainsi que j'ai réalisé après avoir créé et mis à jour.
Dans mon schéma, j'ai ajouté le créé et mis à jour comme suit:
Ensuite, dans ma méthode de mise à jour d'article dans le contrôleur d'article, j'ai ajouté:
Les sections en gras sont les parties d'intérêt.
la source
Docs: https://mongoosejs.com/docs/guide.html#timestamps
la source
Vous pouvez utiliser le
timestamp
plugin demongoose-troop
pour ajouter ce comportement à n'importe quel schéma.la source
Vous pouvez utiliser ce plugin très facilement. À partir de la documentation:
Et définissez également le nom des champs si vous le souhaitez:
la source
nous pouvons y parvenir en utilisant également le plugin de schéma .
Dans le
helpers/schemaPlugin.js
dossieret dans le
models/ItemSchema.js
fichier:la source
Dans votre schéma de modèle, ajoutez simplement un horodatage d' attribut et attribuez-lui la valeur true comme indiqué: -
la source
Vous pouvez maintenant l'utiliser, de sorte qu'il n'est pas nécessaire d'inclure cette option dans chaque table
la source
Ma version mangouste est la 4.10.2
Il semble que seul le crochet
findOneAndUpdate
fonctionnela source
Utilisez une fonction pour renvoyer la valeur par défaut calculée:
la source
Date.now()
une fonction, faites simplement:...default: Date.now()
default: Date.now()
serait faux. Si quelque chose c'estdefault: Date.now
. Sinon, tous vos documents auront le même horodatage: l'heure à laquelle votre application a démarré;)default: Date.now
stratégie. beaucoup plus propre.Je fais ça dans le dos
Si tout se passe bien avec la mise à jour:
la source
Utilisez machinepack-datetime pour formater le datetime.
Le pack machine est génial avec une API claire contrairement au monde Javascript express ou général.
la source
Vous pouvez utiliser des intergiciels et des virtuels . Voici un exemple pour votre
updated_at
domaine:la source
name
. Et oui, cela devrait être persistant.