我在使用MongoDB API更新文档时遇到了一个可能很简单的问题。我尝试了好几件事,但都没有成功。在对比中插入和删除都很好。
那么我在做什么呢。我正在尝试用以下方法更新现有文档:
router.post('/updatecontact', function(req, res) {
console.log(req.body.id);
console.log(req.body.data);
var db = req.db;
var collection = db.get('contacts');
collection.update( { '_id': req.body.id }, req.body.data, true );
});
控制台输出给我:
5666adefcd80a0f3bdbdebe1
{"_id":"5666adefcd80a0f3bdbdebe1","surname":"Test","firstname":"-","group":"-","organization":[{"type":"Verwaltung","name":"Test-Orga","orgunit":""}],"position":"-"}
所以这两个参数似乎都可以,但服务器只返回:
POST /contacts/updatecontact 500 43.911 ms - 1548
replaceOne函数也是如此
router.post('/updatecontact', function(req, res) {
console.log(req.body.id);
console.log(req.body.data);
var db = req.db;
var collection = db.get('contacts');
collection.replaceOne(
{'_id': req.body.id},
JSON.parse(req.body.data),
{upsert: true},
function(err, result){
res.send(
(err === null) ? { msg: '' } : { msg: err }
);
});
});
无论我是否执行JSON.parse()
或使用其他筛选器。
例如{'surname': JSON.parse(req.body.data).surname
},结果不变。
与之形成对比的是下面的插入函数,其中的相关部分似乎是相同的。
router.post('/insert', function(req, res) {
console.log(req.body);
var db = req.db;
var collection = db.get('contacts');
collection.insert(JSON.parse(req.body.data), function(err, result){
console.log(result);
console.log('ID is ' + result._id);
res.send(
(err === null) ? { oid: result._id } : { oid: '' }
);
});
});
有人能解释一下出了什么问题吗?
我以前使用save
方法(req.collection.save)进行更新。我有一个middelware
,它将findById
返回的集合添加到req
。
var middelware = function(req, res, next){
yourCollection.findById(req.params.id, function(err, data){
if(err)
res.status(500).send(err);
else if(data){
req.data= data;
next();
}else{
res.status(404).send('no data found');
}
});
}
//this will update parts of your existing resource
var put = function(req, res){
req.data.a= req.body.a;
req.data.b= req.body.b;
...
req.data.save(function(err) {
if(err)
res.status(500).send(error);
else
res.json(req.data);
});
}
var router = express.Router();
router.use('/:id',middelware);
router.route('/')
.put(put);