将嵌入式阵列保存到Mongoose模型时遇到问题.
请参阅底部的编辑.
我有一个表单,使用Mongoose在Express中创建BlogPost,以便在mongo中存储数据.我可以创建和查看新的博客帖子但是我刚刚添加了嵌入式文档架构Feed到BlogPost模型中,我无法将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,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',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]",id="editBlogPostBodyKey") div#editBlogPostSubmit input(type="submit",value="Send")
如果我填写此表单,模型会发布并保存,但Feed数据不存在(“Feeds”:[]).
我应该如何正确提交Feed数据以保存到阵列?
编辑
所以我设法在BlogPost中设置一个表格来保存带有名称和密钥的Feed对象,执行以下操作.但是,仍需要对此进行改进,以便在创建单个BlogPost时保存多个Feeds.使用我目前的解决方案,我只能正确保存一个Feed.思考?
var Feed = new Schema({ ...
web.js(刚推动推送)
app.post('/blogpost/new',res){ var b = new BlogPost(req.body.b) b.Feeds.push(req.body.Feed); b.save(function() { res.redirect('/blogposts'); });
});
表单(只需更改提要名称)
li span name textarea( name="Feed[name]",id="editBlogPostBodyKey") li span key textarea( name="Feed[key]",id="editBlogPostBodyKey")
解决方法
对于路线:
你不需要做b.Feeds.push();在邮政方面.我在创建一个新对象时有一个推动力,但只是因为我希望至少有一个嵌套模型.然后,看看你如何有一个列表,你可能想要添加b.Feeds.push();在另一方面.
对于视图,您需要保持模型完整.
假设b是blogpost并且它是f列表的父级,那么你需要:
span Feeds : - var i = 0; ul - each Feed in blogPost.Feeds li span name textarea( name="blogPost[Feeds][i][name]",id="editBlogPostBodyName")=Feed.name li span key textarea( name="blogPost[Feeds][i][key]",id="editBlogPostBodyKey")=Feed.key - i++
routes.js(或routes / blogPosts.js):
app.get('/blogpost/new',res) { post = new BlogPost(); post.Feeds.push(new Feed()); res.render('blogposts/blogpost_new.jade',{ locals: { title: 'New BlogPost',blogPost: post } }); });
编辑我将b更改为blogPost,将f更改为视图.还在路由定义中添加了“新”逻辑.
另外,请注意,在这种情况下,任何路线都不可编辑.从理论上讲,它应该在编辑它们时删除并保存任何新的提要(如果你要进行更新操作).如果您希望它们是可以编辑的独立实体,那么您需要提供它们并添加一种通过id获取它们的方法.我认为mongoosejs.com上概述了这种方法.