2011-09-28 181 views
1

将嵌入式数组保存到Mongoose模型时遇到困难。Mongoose - 用嵌入式文档保存模型的表格

请参阅底部的编辑。

我有一个表单在Express中使用Mongoose创建BlogPost来存储mongo中的数据。我可以创建和查看新的相关博客文章,但是我只是增加了一个嵌入文档架构送入博客帖子模型,我不能让进阵列从形式保存到模型

代码:

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" : [ ])。

我应该如何正确提交饲料数据以保存到数组?

编辑

所以我已成功地建立了一个形式与namekey节省饲料对象的博文中执行以下操作。但是,这仍然需要改进,以便在创建单个BlogPost时保存多个Feed。使用我目前的解决方案,我只能正确保存一个Feed。思考?

blogposts.js(只是改变饲料到订阅

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'); 
}); 

});

形式(只是改变饲料名)

li 
     span name 
     textarea(name="feed[name]", rows=20, id="editBlogPostBodyKey") 
    li 
     span key 
     textarea(name="feed[key]", rows=20, id="editBlogPostBodyKey") 

这正确的扑救,我只是不能在储蓄时的博文中创建多个饲料。任何帮助不胜感激。谢谢。

回答

0

为了什么是值得的,我确实得到了这个工作。查看我上面的编辑,其中一旦我向Feed名称添加了[]:"feed[0][name]" and "feed[0][key]",然后"feed[1][name]" and "feed[1][key]"。感谢偶然的一些好点子。对于我来说,把这个逻辑放在'get'路线中是不行的,它需要在'post'中。非常感谢。

1

对于路线:

你并不需要在后侧面做b.feeds.push();。创建新对象时,我有一个推动力,但只是因为我期望至少有一个嵌套模型。然后再看看你如何得到一份清单,你也可以在获得方面增加b.feeds.push();

对于视图,您需要保持模型不变。

假定B是博客帖子,它是你的父母到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(或路线/相关博客文章。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键博客帖子和f到视图饲料。还在路线定义中添加了“新”逻辑。

请注意,在这种情况下,任何路线都不可编辑。理论上讲,它应该在编辑它们的时候下载并保存任何新的提要(如果你有更新操作的话)。如果你想让它们成为可以编辑的独立实体,那么你需要提供它们,并添加一个通过id获取它们的方法。我相信mongoosejs.com上概述了这种方法。

+0

我不是100%的= f.name/= f.key,因为我刚刚从哈姆切换到玉,但我认为这是正确的 – Chance

+0

我喜欢这里的情况。我目前正在得到:' - i ++'行上的参考错误,它说'b没有定义' – tuddy

+0

我想我需要在app.get new中以可用的方式定义b? – tuddy