2015-10-23 45 views
1

我在express.js中使用mongodb有一个简单的学生数据库程序。如何对以下程序执行更新操作: 我的app.js程序如下:如何在express.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帮助我。

回答

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)约定没有必要打电话给他们自己,你可以将它们传递给蒙戈调用他们为你。

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)); 
    } 
    }); 
}); 

作为旁注,您可以查看nodejs的mongoose模块,直接使用MongoDB本地驱动程序稍微冗长些。

也看到你对nodejs相当陌生,我建议阅读更多关于RESTful服务的内容类型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)); 
    }); 
相关问题