检查文档中的字段

时间:2012-06-23 18:21:03

标签: node.js mongodb express mongoose

假设我有以下架构

 var userSchema = new Schema({
    name : String
  });

  var User = mongoose.model('User',userSchema);

编辑:如果用户尝试更新字段,那就不存在,我需要抛出异常。我的问题是如何检查更新文档中不存在更新字段。这是我需要的一个小例子:

  app.post('/user/update/:id', function (req, res) {
     var field = req.param('field'),
          value = req.param('value'),
          id = req.param('id');

     User.findOne({_id: id},function(err, user){
        if(err) throw err;

        if (user) {

          user[field] = value;          // Here is I need to check that field is exists
                                        // in user schema. If does't I have to throw 
                                        // an execption.

          user.save(function (err){
             return res.send(200);
          });
        }            
     })
  });

4 个答案:

答案 0 :(得分:0)

尝试将$exists添加到update()的查询参数中。这将允许您仅在某个字段存在(或不存在)时更新文档。

http://www.mongodb.org/display/DOCS/Advanced+Queries#AdvancedQueries-%24exists

答案 1 :(得分:0)

来自Mongoose v3.1.2指南:

  

strict选项(默认情况下启用)确保添加到模型实例中的未在我们的模式中指定的值不会保存到db。注意:除非您有充分的理由,否则不要设置为false。

     

strict选项也可以设置为“throw”,这将导致产生错误而不是忽略错误数据。

http://mongoosejs.com/docs/guide.html#strict

答案 2 :(得分:0)

var CollectionSchema = new Schema({name: 'string'}, {strict: 'throw'});

Collection.findById(id)
  .exec(function (err, doc) {
    if (err) {// handle error};

    // Try to update not existing field
    doc['im not exists'] = 'some';
    doc.save(function (err) {
      if (err) {
         // There is no an errors
      }

      return res.json(200, 'OK');
    });

  });

在上面的示例中,当我更新不存在的字段时,我没有收到错误。

答案 3 :(得分:0)

您可以使用field检查schema中是否存在.schema.path()。在您的特定用例中,您可以执行以下操作:

app.post('/user/update/:id', function (req, res) {
 var field = req.param('field'),
      value = req.param('value'),
      id = req.param('id');

  User.findOne({_id: id},function(err, user){
    if(err) throw err;

    if (user) {

      if(User.schema.path(field)) {
        user[field] = value;
      } else {
        throw new Error('Field [' + field + '] does not exists.');
      }

      user.save(function (err){
        return res.send(200);
      });
    }            
  });
});