2011-02-17 80 views
19

我想在MongoDB中更新一个实例化的模型('Place' - 我知道它可以从其他路径中工作),并花了一段时间试图正确地做到这一点。我还尝试重新导向到查看“地点”以查看更新属性的页面。Mongoose,Express,NodeJS更新模型

节点V0.4.0,快速v1.0.7,猫鼬1.10.0

架构:

var PlaceSchema = new Schema({ 
name :String 
, capital: String 
, continent: String 
}); 

控制器/路线:

app.put('/places/:name', function(req, res) { 
var name = req.body.name; 
var capital = req.body.capital; 
var continent = req.body.continent; 
Place.update({ name: name, capital: capital, continent: continent}, function(name) { 
    res.redirect('/places/'+name) 
}); 

});

我试过了一堆不同的方法,但似乎无法得到它。
另外,是不是我如何声明阻止进一步操作的三个{名称,资本和大陆}变量?谢谢。一般调试帮助也表示赞赏。 Console.log(名称)(位于声明下方)不记录任何内容。

玉器形式:

h1 Editing #{place.name} 
form(action='/places/'+place.name, method='POST') 
    input(type='hidden', name='_method', value='PUT') 
    p 
    label(for='place_name') Name: 
    p 
    input(type='text', id='place_name', name='place[name]', value=place.name) 
    p 
    label(for='place_capital') Capital: 
    p 
    input(type='text', id='place_capital', name='place[capital]', value=place.capital) 
    p 
    label(for='place_continent') Continent: 
    p 
    textarea(type='text', id='place_continent', name='place[continent]')=place.continent 
    p 
    input(type="submit") 

回答

32

你必须找到任何更新前的文件:使用你有相同的设置

Place.findById(req.params.id, function(err, p) { 
    if (!p) 
    return next(new Error('Could not load Document')); 
    else { 
    // do your updates here 
    p.modified = new Date(); 

    p.save(function(err) { 
     if (err) 
     console.log('error') 
     else 
     console.log('success') 
    }); 
    } 
}); 

作品我在生产代码。而不是findById,你可以使用猫鼬提供的任何其他查找方法。只需确保在更新文档之前获取文档。

+0

这就是我如何做到的。 – Carlosedp 2011-02-22 18:05:16

0

我认为你的问题是,你正在使用节点0.4.0 - 尝试移动到0.2.6与它应该工作。 bodyDecoder没有在节点> = 0.3.0中填充req.body.variable字段,在github上记录了一个问题。

17

现在,我想你可以这样做:

Place.findOneAndUpdate({name:req.params.name}, req.body, function (err, place) { 
    res.send(place); 
}); 

您可以通过ID也发现:

Place.findOneAndUpdate({_id:req.params.id}, req.body, function (err, place) { 
    res.send(place); 
}); 
0

所以现在可以直接通过ID发现,这是猫鼬V4

Place.findByIdAndUpdate(req.params.id, req.body, function (err, place) { 
    res.send(place); 
}); 

只需要提一下,如果您需要更新对象,那么您需要通过{new: true},比如

Place.findByIdAndUpdate(req.params.id, req.body, {new: true}, function (err, place) { 
    res.send(place); 
});