Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to check if that data already exist in the database during update (Mongoose And Express)

How to do validations before saving the edited data in mongoose?

For example, if sample.name already exists in the database, the user will receive a some sort of error, something like that, here's my code below

//Post: /sample/edit app.post(uri + '/edit', function (req, res, next) {   Sample.findById(req.param('sid'), function (err, sample) {      if (err) {       return next(new Error(err));     }      if (!sample) {       return next(new Error('Invalid reference to sample information'));     }      // basic info     sample.name = req.body.supplier.name;     sample.tin = req.body.supplier.tin;      // contact info     sample.contact.email = req.body.supplier.contact.email;     sample.contact.mobile = req.body.supplier.contact.mobile;     sample.contact.landline = req.body.supplier.contact.landline;     sample.contact.fax = req.body.supplier.contact.fax;      // address info     sample.address.street = req.body.supplier.address.street;     sample.address.city = req.body.supplier.address.city;     sample.address.state = req.body.supplier.address.state;     sample.address.country = req.body.supplier.address.country;     sample.address.zip = req.body.supplier.address.zip;      sample.save(function (err) {       if (err) {         return next(new Error(err));       }        res.redirect(uri + '/view/' + sample._id);     });    }); }); 
like image 736
Miguel Lorenzo Avatar asked Jun 02 '13 12:06

Miguel Lorenzo


People also ask

How do you check if data already exists in database in MongoDB?

You can use the Find operation in the MongoDB node. In the Query field you can enter your MongoDB query to search for the records.

Does update call save in mongoose?

When you create an instance of a Mongoose model using new , calling save() makes Mongoose insert a new document. If you load an existing document from the database and modify it, save() updates the existing document instead.

What is done () in mongoose?

It just means that your new document will have a field with "done" as key and "false" boolean as value.

Does mongoose have built in validation?

Mongoose has several built-in validators. All SchemaTypes have the built-in required validator. The required validator uses the SchemaType's checkRequired() function to determine if the value satisfies the required validator. Numbers have min and max validators.


1 Answers

Typically you could use mongoose validation but since you need an async result (db query for existing names) and validators don't support promises (from what I can tell), you will need to create your own function and pass a callback. Here is an example:

var mongoose = require('mongoose'),     Schema = mongoose.Schema,     ObjectId = Schema.ObjectId;  mongoose.connect('mongodb://localhost/testDB');  var UserSchema = new Schema({     name: {type:String} });  var UserModel = mongoose.model('UserModel',UserSchema);  function updateUser(user,cb){     UserModel.find({name : user.name}, function (err, docs) {         if (docs.length){             cb('Name exists already',null);         }else{             user.save(function(err){                 cb(err,user);             });         }     }); }  UserModel.findById(req.param('sid'),function(err,existingUser){    if (!err && existingUser){        existingUser.name = 'Kevin';        updateUser(existingUser,function(err2,user){            if (err2 || !user){                console.log('error updated user: ',err2);            }else{                console.log('user updated: ',user);            }         });    }  }); 

UPDATE: A better way

The pre hook seems to be a more natural place to stop the save:

UserSchema.pre('save', function (next) {     var self = this;     UserModel.find({name : self.name}, function (err, docs) {         if (!docs.length){             next();         }else{                             console.log('user exists: ',self.name);             next(new Error("User exists!"));         }     }); }) ; 

UPDATE 2: Async custom validators

It looks like mongoose supports async custom validators now so that would probably be the natural solution:

    var userSchema = new Schema({       name: {         type: String,         validate: {           validator: function(v, cb) {             User.find({name: v}, function(err,docs){                cb(docs.length == 0);             });           },           message: 'User already exists!'         }       }     }); 
like image 108
mr.freeze Avatar answered Sep 30 '22 16:09

mr.freeze