使用mongoose更新,不返回任何错误但不更新

时间:2015-05-04 13:37:50

标签: javascript node.js mongoose

我正在尝试用猫鼬学习CRUD。我只是错过了更新部分。我做错了什么?

我的模特

var mongoose = require('mongoose');

var testSchema = new mongoose.Schema({
    name: String,
    number: Number
});

mongoose.model('TestData', testSchema);

我的路线

// get the models
var Test = mongoose.model('TestData');

PARAM
如果链接具有'test'作为url参数,则会查看对象是否存在于数据库中,否则返回错误。

router.param('test', function(req, res, next, id){
    var query = Test.findById(id);

    query.exec(function(err, test){
        if(err){ return next(err); }
        if(!test){ return next(new Error('can\'t find test')); }
        req.test = test;
        return next();
    });
});

GET BY ID

    /* GET testdata/:id */
    router.get('/testingdata/:test', function(req, res, next){
        req.test.populate('test', function(err, test){
            res.json(test);
        });
    });

删除

/* DELETE testdata/:id */
router.delete('/testingdata/:test', function(req, res, next){
    req.test.remove('test', function(err, test){
        console.log('removed');
        res.json(test);
    });                         
});

我的问题
现在问题来了,如果我尝试更新一个,我只是遗漏了一些东西。

/* PUT testdata/:id */
router.put('/testingdata/:test', function(req, res, next){
    req.test.update('test',{$set: {name: 'new data'}} , function(err, test){
        res.json(test);
    });                         
});

我没有收到任何错误,但它既没有更新任何内容。它甚至返回了一些数据。

{
    "ok": 0,
    "n": 0,
    "nModified": 0
}

2 个答案:

答案 0 :(得分:4)

尝试没有不必要的第一个参数(test),因为req.testTest模型的一个实例。

req.test.update({name: 'new data'} , function(err, test){
  res.json(test); // test would be `1` if success
});

update方法不会返回对象,如果要返回对象,则使用save

req.test.name = 'new data';
req.test.save(function(err, test){
  res.json(test);
});

答案 1 :(得分:1)

您的问题在于删除和更新方法都不适用于模型实例但需要查询,例如

{_id:id}

您的更新语句与任何内容都不匹配,我敢打赌您的删除端点也不会正常工作。

如果你想在req.test上运行实时模型实例,那么直接在test上设置值并保存模型:

req.test.name= 'new data';
req.test.save(...

删除模型总是需要新的查询,因为您无法直接删除实例。