Mongoose validation only when changed

I want to validate a users email address, but only when it is changed. The following code seems to vlaidate everytime I make a save to any Entrant, and therefore is throwing an error that the email is a duplicate when it saves itself.

How do I properly validate when the Entrant is created rather than everytime I make an edit and save?

EntrantSchema.pre 'save', (next)->
  user = this  
  # Email Validation
  if (user.isModified('email'))
    console.log "Email has been changed".green.inverse

    # Unique Value
    EntrantSchema.path("email").validate ((email,respond) ->
      Entrant.findOne {email:email}, (err,user) ->
        if user
          respond(false)
        respond(true)
    ), "Oopsies! That e-mail’s already been registered"

Note that I think the validate() is being bound the first time, because when I update a user, I do not get "Email has been changed", which I'm console.logging in my code

You're using validation the wrong way. Mongoose attach validators to the schema and not to the single document, which makes them global.

So, instead of validating email in pre 'save' you should define a good email validator:

EntrantSchema.path('email').validate ((email,respond) ->
  return respond true unless @isModified 'email'
  Entrant.count {email}, (err, count) ->
    respond count is 0
), "Oopsies! That e-mail’s already been registered"

But if you want email to be unique then it's best to use unique index instead:

EntrantSchema = new mongoose.Schema
  email: type: String, unique: true

Checking unique values in validators leaves the possibility to update two users with the same email.

By the way, hooks (pre and post) will be removed in Mongoose 4.0.