MongooseJS modifier le document au cours de la pré crochet
Je vais avoir quelques problèmes avec la mangouste. Mon objectif est qu'au cours de la pré-enregistrer, je serais en mesure de modifier l'objet, en faisant des choses comme le fractionnement, les balises, si nécessaire, ou dans un autre cas, le calcul de la somme d'un sous-document de durées et de mise à jour dans le document principal.
Ce que je vais trouver, c'est que si je charge un modèle, puis d'appeler le doc.mise à jour de l'adoption de la nouvelle données, seulement schema.pre('update', ...)
déclenche, et de toute modification de this
dans mon middleware ne sont pas mis à jour. J'ai aussi essayé d'utiliser this.set('...', ....);
dans ma mise à jour middleware en vain.
Il semble que si je ne doc.save(...)
au lieu de cela, il passe ensuite à this
dans schema.pre('save', ...)
sont ajoutés comme prévu. Outre l'extension de la publication des variables dans mon propriétés du modèle et d'économie, je ne vois pas de toute façon de tirer parti des doc.mise à jour à cet effet.
Mes Objectifs:
- Mise à jour d'un document existant via doc.update(properties, ....)
- L'utilisation du middleware, lors de la sauvegarde de modifier le document, avancées de la validation et de mise à jour des documents connexes
- L'utilisation du middleware lors de la mise à jour pour modifier le document, avancées de la validation et de mise à jour des documents connexes
- Utiliser de façon interchangeable modèle.findByIdAndUpdate, modèle.enregistrer, modèle.findById->doc.mise à jour, modèle.findById->doc.enregistrer et tous les puiser dans ma sauvegarde/mise à jour le middleware.
Arbitraire exemple de code:
function loadLocation(c) {
var self = this;
c.Location.findById(c.params.id, function(err, location) {
c.respondTo(function(format) {
if (err | !location) {
format.json(function() {
c.send(err ? {
code: 500,
error: err
} : {
code: 404,
error: 'Location Not Found!'
});
});
format.html(function() {
c.redirect(c.path_to.admin_locations);
});
} else {
self.location = location;
c.next();
}
});
});
}
LocationController.prototype.update = function update(c) {
var location = this.location;
this.title = 'Edit Location Details';
location.update(c.body.Location, function(err) {
c.respondTo(function(format) {
format.json(function() {
c.send(err ? {
code: 500,
error: location && location.errors || err
} : {
code: 200,
location: location.toObject()
});
});
format.html(function() {
if (err) {
c.flash('error', JSON.stringify(err));
} else {
c.flash('info', 'Location updated');
}
c.redirect(c.path_to.admin_location(location.id));
});
});
});
};
module.exports = function(compound) {
var schema = mongoose.Schema({
name: String,
address: String,
tags: [{ type: String, index: true }],
geo: {
type: {
type: String,
default:
"Point"
},
coordinates: [Number] //Longitude, Latitude
}
});
schema.index({
geo: '2dsphere'
});
var Location = mongoose.model('Location', schema);
Location.modelName = 'Location';
compound.models.Location = Location;
schema.pre('save', function(next) {
if(typeof this.tags === 'string') {
this.tags = this.tags.split(',');
}
});
};
==== * mise à jour de l'échantillon * ====
module.exports = function(compound) {
var schema = mongoose.Schema({
name: String,
bio: String
});
schema.pre('save', function(next) {
console.log('Saving...');
this.bio = "Tristique sed magna tortor?";
next();
});
schema.pre('update', function(next) {
console.log('Updating...');
this.bio = "Quis ac, aenean egestas?";
next();
});
var Author = mongoose.model('Author', schema);
Author.modelName = 'Author';
compound.models.Location = Author;
};
Vous devez vous connecter pour publier un commentaire.
pre
crochets de travail pour les deuxdoc.save()
etdoc.update()
. Dans les deux casthis
se réfère au document lui-même.Noter que les crochets doivent être ajoutés à votre schéma avant de compiler votre modèle.
Author.findById
, quand je l'appelleauthor.update(c.req.body, ...)
,schema.pre('save', ...)
ne déclenche pas, cependantschema.pre('update', ...)
ne et les changements dethis.name
ne sont pas appliquées.schema.pre('save', ...)
devrait déclencher non? Il ne ressemble à l'auteur.enregistrer les déclencheursschema.pre('save', ...)
et les changements qui sont ensuite appliquées. La solution est là seulement pour abandonnerauthor.update
en tout?doc.update()
n'entraînera pas de crochets pour toute autre méthode, mais celui qui est appelé.schema.pre('update', ...)
ne sont pas ajoutés à la fin. Est-ce un bug, la destine, ou devrais-je simplement en utilisant exclusivement doc.enregistrer et d'utiliser une méthode pour effectuer une itération sur mon req.corps et de fusionner des propriétés?document.update(doc, cb)
envoie une mise à jour de la doc, pas le actuellement à la modification des valeurs. C'est différent dedocument.save()
.Mangouste n'a pas de point d'accroche à la mise à Jour du Modèle de l'API. Toutefois, une mise à jour de crochet peut être fait par le biais de Singe-patch. Le Talonneur package NPM est un bon moyen de le faire proprement.
La RESTeasy projet qui est un Standard pour le Nœud des Api REST a un code qui montre comment le faire:
update
crochets de travailler en mode natif dans la Mangouste 4.0, mais elles sont désactivées par défaut. Ce blog explique: mongodb.com/blog/post/...