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对象的namekey在一个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'中。 非常感谢。