如何在express.js中进行更新操作

时间:2015-10-23 06:10:14

标签: node.js mongodb

我使用mongodb在express.js中有一个简单的学生数据库程序。如何对以下程序执行更新操作: 我的app.js程序如下:

var studentDb=new StudentDb('localhost',27017);
app.get('/',function(req,res){
  studentDb.findAll(function(error,stu){
    res.end(JSON.stringify({
      title:'students',
      students:stu
    }));
  });
});

app.get('/student/new',function(req,res)
{
  var rollno=req.param('rollno');
  studentDb.findByrollno(rollno,function(error,docs)
  { 
   if( error )  {  res.end(JSON.stringify(error)); }else{  
         if(docs.length==1) 
          {res.end('already has  one.');}
        else
         {  studentDb.save({
              title:req.param('title'),
              name:req.param('name'),
              rollno:req.param('rollno')
            },
            function(error,docs)
            {
            console.log(docs);
            });setTimeout(function(){ res.redirect('/');},5000);}}


  });
});
app.delete('/student/new', function (req, res) {

     studentDb.findByrollno(req.param('rollno'), function (error, docs) {
         studentDb.delete(req.param('rollno'),function (error,students) {
            if (error) {
                console.log(error);
            } else {
                console.log("deleted rollno: " + req.param('rollno'));

            }   res.end(JSON.stringify(students));
        });
    });
});

here is my studentdb.js file

var Db = require('mongodb').Db;
var Connection = require('mongodb').Connection;
var Server = require('mongodb').Server;
var JSON = require('mongodb').JSON;
var ObjectID = require('mongodb').ObjectID;

StudentDb = function(host, port) {
  this.db= new Db('studentdata', new Server(host, port, {safe: false}, {auto_reconnect: true}, {}));
  this.db.open(function(){});
};


StudentDb.prototype.getCollection= function(callback) {
  this.db.collection('students', function(error, student_collection) {
    if( error ) callback(error);
    else callback(null, student_collection);
  });
};
StudentDb.prototype.findAll = function(callback) {
    this.getCollection(function(error, student_collection) {
      if( error ) callback(error)
      else {
        student_collection.find().toArray(function(error, results) {
          if( error ) callback(error)
          else callback(null, results)
        });
      }
    });
};
StudentDb.prototype.findByrollno = function(rollno,callback) {
    this.getCollection(function(error, student_collection) {
      if( error ) callback(error)
      else {
        student_collection.find({rollno:rollno}).toArray(function(error, results) {
          if( error ) callback(error)
          else callback(null, results)
        });
      }
    });
};
StudentDb.prototype.save = function(students, callback) {
    this.getCollection(function(error, student_collection) {
      if( error ) callback(error)
      else {
        if( typeof(students.length)=="undefined")
          students = [students];

        for( var i =0;i< students.length;i++ ) {
          student = students[i];
          student.created_at = new Date();
        }

        student_collection.insert(students, function() {
          callback(null, students);
        });
      }
    });
};
StudentDb.prototype.delete = function(rollno,callback) {
    this.getCollection(function(error, student_collection) {
      if( error ) callback(error)
      else {
        student_collection.remove({rollno:rollno},function(error, results) {
          if( error ) callback(error)
          else callback(null, results)
        });
      }
    });
};

我需要更新学生数据库中的字段。但我不知道使用更新query.pls帮助我。

2 个答案:

答案 0 :(得分:0)

您的意思是您不知道如何实施StudentDb.update方法?您只需要使用Mongo的更新运算符创建一个对象。有关如何使用这些here的好文档。此方法将更新一个学生设置您在学生的updatedFields对象中设置的任何字段:

// updatedFields should be an object with fields to set on the student
// e.g. updatedFields = {name: "Bob", favouriteSubject: "Computing"}
StudentDb.prototype.update = function(rollno, updatedFields, callback) {
  this.getCollection(function(error, student_collection) {
    if( error ) callback(error)
    else {
      student_collection.updateOne(
        {rollno: rollno},
        {$set: updatedFields}, 
        callback
      );
    }
  });
};

请注意,由于您的回调遵循callback(err, result)约定,因此您无需亲自调用它们,您可以将它们传递给Mongo以便为您调用。

答案 1 :(得分:0)

来自MongoDb文档:

db.collection.update(
  <query>,
  <update>,
  {
    upsert: <boolean>,
    multi: <boolean>,
    writeConcern: <document>
  }
)

来源:MongoD docs

您可以在StudentDb对象原型上创建一个新方法来处理更新操作:

StudentDb.prototype.update = function (rollno, updatedFields, callback) {
  this.getCollection(function(error, student_collection) {
    if( error ) callback(error);
    else {
      student_collection.update({rollno: rollno}, updatedFields, function (err, updatedStudent) {
        if (err) callback(err);
        else callback(null, updatedStudent);
      });
    }

使用PUT HTTP动词添加新的处理程序:

app.put('/student/new', function (req, res) {
  studentDb.update(req.param('rollno'), req.body, function (err, student){
    if (err) {
      console.error(err);
    } else {
      res.send(JSON.stringify(student));
    }
  });
});

作为旁注,您可以查看mongoose模块中的nodejs,直接使用MongoDB本机驱动程序有点冗长。

同时看到你对nodejs还不熟悉,我建议你阅读更多关于RESTful服务,'Content-Type'HTTP标头并以JSON格式发送你的数据。

在响应HTTP请求时改进您的错误处理(例如,如果更新操作失败,请让客户知道它):

  studentDb.update(req.param('rollno'), req.body, function (err, student){
    if (err) {
      console.error(err);
      res.status(500).json(err); // respond with HTTP status 500 (internal server error)
    } else {
      console.log("updated rollno: " + req.param('rollno'));
    } res.send(JSON.stringify(student));
  });