2017-05-12 140 views
0

嘿家伙我有一个问题,如何在将编辑或发布的(发布或放置操作)数据保存在猫鼬中之前进行验证!如何检查数据在数据库中是否已经存在保存

例如,如果操作已经存在于数据库中,用户将收到某种错误。我尝试这一点,但不工作: 1-NOT WORK

var mongoose = require("mongoose"), 
    Schema = mongoose.Schema; 

var actionSchema = new Schema({ 
    action: { 
      type: String, 
      required: true, 

      }, 
    }); 

var data = mongoose.model('Action', actionSchema); 

actionSchema.pre('save', function (next) { // Middlware to verify if action already existe 
    var self = this; 
    data.find({ 
    action: self.action 
    }, function (err, actions) { 
    if (!actions.length) { 
     next(); 
     } else { 
      console.log('action exists: ', self.name); 
      next(new Error("Action exists!")); 
     } 
    }); 
}); 

module.exports = mongoose.model('Action', actionSchema); 

2 ---不做事其次METHODE:---------------------- --------------

var data = mongoose.model('Action', actionSchema); 

actionSchema.pre('save', function (next) { 
data.count({ 
    action: this.action 
}, function (err, count) { 
    if (count == 1) { 
     console.log('action exists: ', this.action); 
     next(new Error("Action exists!")); 
     //already exists 
     } else { 
      next(); 
      //do the action 
     } 
    }); 
    }); 

3- WORKING另类 - NODE JS控制器----我发现这招(工作好)那就是做前检查更新(支票) 但是我想知道在我的模型MONGOOSE中保存之前是否有可能做到这一点?

// router.put('/actions/:action_id'); 

Action.findById(req.params.action_id, function (err, upaction) { 
    if (err) { //no action id in database match with params.action_id 
     res.send(err); 
    } else { // find == true 


// chek if action name existe 
    Action.findOne({ 
        'action': req.body.action 
       }) 
      .exec(function (err, found_action) { 
        if (err) { // ereur bizare sest produite 
         next(err); 
        } 

         if (found_action) { // name action exist 
         res.send('name action existe'); 
         } 
      else { // name action no exist 

      upaction.action = req.body.action; 

         upaction.save(function (err, acti) { 
          if (err) { 
           res.send('error on save'); 
          } 
          res.send(upaction); // send a document 
         }); 
        } 
       }); 
     } 
    }); 
+0

我不明白你为什么要做这么多的操作来做一个单一的操作。如果你想在你的行动领域独特的价值比你可以使用“行动:{0128} },“ 比你不能添加或更新已存在的值在动作字段比猫鼬自动抛出错误。 –

+0

我用这个,但每次POST都添加文档。 例如:操作1:“堆栈” 操作2“堆栈” .... –

+0

我没有同时使用所有这些操作。 –

回答

0

检查是否该数据已经avaliable,然后执行动作要

var data = mongoose.model('data', actionSchema); 
data.count({action: this.action}, function(err, count) { 
    if(count == 1){ 
    //already exists 
    } 
     else{ 
    actionSchema.pre('save', function (next) { 
     }); 
     } 
     }); 
+0

TypeError:actionSchema.count不是函数 –

+0

看到我更新的答案 –

+0

没有错误,但不工作! –

0

我不明白为什么要那样做太多的操作做单操作。 Mongodb提供了更新功能,可以检查和插入。如果您希望仅在某些条件成立或失败时才插入文档。 update可以单独查询。干得好。

Action.update({ action:{ $eq:req.body.action }},{ $setOnInsert: new_action }, { upsert: true }, function(err, res){ 
    if(!err && !!res.upserted){ 
     // no document was found hence inserted 
    }else if(!err && !res.upserted){ 
     // already existing 
    }else{ 
     // something wicked happend 
    } 
}) 

这里需要注意的是不能是你的猫鼬模型的实例,而应该是简单的对象/要插入的文件。

+0

TypeError:无法读取属性'upserted'的undefined –

+0

我使用猫鼬! –

+0

对不起!其实我写了mongodb语法,我已经更新了它。看一看。 – nurulnabi

相关问题