mongoose – 用embedded文件保存模型的表单
无法将embedded式数组保存到Mongoose模型。
请参阅底部的编辑。
我有一个表单,使用Mongoose在Express中创buildBlogPost,以将数据存储在mongo中。 我可以创build和查看新的博客post,但是我只是在BlogPost模型中添加了一个embedded式文档模式Feed,并且无法让Feed数组从模板保存到模型中
码:
BlogPosts.js
var mongoose = require('mongoose'); mongoose.connect('mongodb://localhost/my_database'); var Schema = mongoose.Schema , ObjectId = Schema.ObjectId; var Feeds = new Schema({ name : { type: String } , key : { type: String } }); var BlogPost = new Schema({ author : ObjectId , title : { type: String, required: true, index: { unique: true } } , date : { type: Date, required: true, default: Date.now } , feeds : [Feeds] }); mongoose.model('BlogPost', BlogPost);
web.js
... app.get('/blogpost/new', function(req, res) { res.render('blogposts/blogpost_new.jade', { locals: { title: 'New BlogPost' } }); }); app.post('/blogpost/new', function(req, res){ var b = new BlogPost(req.body.b) b.save(function() { b.feeds.push(); res.redirect('/blogposts'); }); }); ... var BlogPost = mongoose.model('BlogPost', BlogPost);
玉形
form( method="post") div div span Title : input(type="text", name="b[title]", id="editBlogPostTitle") div span Feeds : ul li span name textarea( name="f[name]", rows=20, id="editBlogPostBodyName") li span key textarea( name="f[key]", rows=20, id="editBlogPostBodyKey") div#editBlogPostSubmit input(type="submit", value="Send")
如果我填写这个表单,模型发布和保存,但饲料数据不存在( "feeds" : [ ]
)。
我应该如何正确地提交饲料数据保存到arrays?
编辑
所以我设法设置了一个表单来保存一个Feed对象的name
和key
在一个BlogPost中执行以下操作。 但是,这仍然需要改进,以允许在创build单个BlogPost时保存多个Feed。 使用我目前的解决scheme,我只能正确保存一个Feed。 思考?
blogposts.js(只是将Feed更改为Feed
var Feed = new Schema({ ...
web.js(只是移动推)
app.post('/blogpost/new', function(req, res){ var b = new BlogPost(req.body.b) b.feeds.push(req.body.feed); b.save(function() { res.redirect('/blogposts'); });
});
forms(只更改饲料名称)
li span name textarea( name="feed[name]", rows=20, id="editBlogPostBodyKey") li span key textarea( name="feed[key]", rows=20, id="editBlogPostBodyKey")
这可以保存正确,我不能在保存时在博客内创build多个Feed。 任何帮助不胜感激。 谢谢。
对于路线:
你不需要做b.feeds.push();
在岗位边。 创build一个新的对象时,我有一个推动,但只是因为我期望至less有一个嵌套模型。 然后,再看看你如何有一个列表,你可能想添加b.feeds.push();
在获得方面也是如此。
对于这个观点,你需要保持模型不变。
假设b是博客post,它是你的父母的f列表,那么你会想要:
span Feeds : - var i = 0; ul - each feed in blogPost.feeds li span name textarea( name="blogPost[feeds][i][name]", rows=20, id="editBlogPostBodyName")=feed.name li span key textarea( name="blogPost[feeds][i][key]", rows=20, id="editBlogPostBodyKey")=feed.key - i++
routes.js(或routes / blogPosts.js):
app.get('/blogpost/new', function(req, res) { post = new BlogPost(); post.feeds.push(new Feed()); res.render('blogposts/blogpost_new.jade', { locals: { title: 'New BlogPost', blogPost: post } }); });
编辑我改变了b到blogPost和F来喂视图。 还在路由定义中增加了“新”逻辑。
请注意,在这种情况下,任何路线都不可编辑。 理论上讲,它应该在编辑它们的时候(如果你有一个更新操作的话)下载并保存任何新的feed。 如果你希望他们是可以编辑的独立实体,那么你需要提供他们的id,并添加一个通过id获取他们的方法。 我相信在mongoosejs.com上列出了这个方法。
为了什么是值得的,我确实得到了这个工作。 看到我上面的编辑,一旦我添加一个[]饲料名称: "feed[0][name]" and "feed[0][key]"
,然后"feed[1][name]" and "feed[1][key]"
。 感谢一些好主意的机会。 对于我来说,把这个逻辑放在'get'路线上是不行的,它需要在'post'中。 非常感谢。