使用Mongoose进行更新,没有返回任何错误,但是也没有更新成功。

8

我正在尝试学习使用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');

如果链接中的url参数为'test',它将查找数据库中是否存在对象,否则返回错误。
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();
    });
});

按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个回答

5
尝试不带无用的第一个参数(test),因为req.testTest模型的实例。
req.test.update({name: 'new data'} , function(err, test){
  res.json(test); // test would be `1` if success
});
< p > update 方法不返回对象,如果您想返回对象,请使用 save

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

1
正是我所需要的,它运行得非常好。我不知道响应数据是否与ok: 1或ok: 0有关,很高兴你指出了这一点。感谢提供保存功能,确实更好。 - Sigils

1
你的问题在于删除和更新方法都不适用于模型实例,而需要进行查询,例如:
{_id:id}

你的更新语句没有匹配任何内容,我敢打赌你的删除端点也不会起作用。
如果你想在req.test上操作实例模型,请直接在test上设置值并保存模型:
req.test.name= 'new data';
req.test.save(...

删除模型始终需要进行新的查询,因为您无法直接删除实例。


你好,Robert,感谢你的回答。但实际上,在你说我的删除端点不起作用后,我有些慌了,不得不测试了几次。事实上,它似乎确实在工作,但也许这是一个不好的习惯?你会推荐使用纯MongoDB语法吗?{_id:test['_id'] },{name:'new data'} - Sigils

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接