我使用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帮助我。
答案 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));
});