Mongoose – Modulo per salvare il modello con documenti incorporati

Problemi con il salvataggio di un array incorporato in un modello Mongoose.

Si prega di vedere Modifica in fondo.

Ho un modulo per creare BlogPost in Express usando Mongoose per memorizzare i dati in mongo. Posso creare e visualizzare nuovi post di blog, tuttavia ho appena aggiunto uno schema di documento incorporato Feed nel modello BlogPost e non riesco a recuperare gli array di feed dal modulo nel modello

codice:

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

Forma di giada

 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") 

Se compilo questo modulo, il modello invia e salva ma i dati dei feed non sono presenti ( "feeds" : [ ] ).

Come devo inviare correttamente i dati dei feed per salvare nell’array?

modificare

Così sono riuscito a creare un modulo per salvare un object Feed con name e key all’interno di un BlogPost che segue quanto segue. Tuttavia, questo deve ancora essere migliorato per consentire la memorizzazione di più feed al momento della creazione di un singolo BlogPost. Con la mia soluzione attuale posso solo salvare un feed correttamente. Pensieri?

blogposts.js (cambia solo Feed per Feed

 var Feed = new Schema({ ... 

web.js (ho appena spostato la spinta)

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

});

modulo (basta cambiare i nomi dei feed)

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

Ciò consente di risparmiare correttamente, ma non riesco a creare più feed all’interno di un blogpost al momento del salvataggio. Qualsiasi aiuto molto apprezzato. Grazie.

Per i percorsi:

Non è necessario fare b.feeds.push(); sul lato post. Ho una spinta sul lato get quando creo un nuovo object, ma solo perché mi aspetto che ci sia almeno un modello annidato. Poi di nuovo, visto come hai una lista, potresti voler aggiungere b.feeds.push(); anche dal lato destro.

Per la vista, è necessario mantenere il modello intatto.

Supponendo che b sia blogpost ed è il tuo genitore della f list, allora dovresti:

 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 (o 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 } }); }); 

modifica ho cambiato b in blogPost e f per alimentare la vista. ha anche aggiunto la “nuova” logica nella definizione dei percorsi.

Nota a margine, tieni presente che in questo caso le rotte non saranno modificabili. Dovrebbe, in teoria, rilasciare e salvare tutti i nuovi feed in anche di modificarli (se si dovesse avere un’azione di aggiornamento). Se vuoi che siano quadro indipendenti che possono essere modificate, devi fornire loro id e aggiungere un mezzo per ottenerle tramite id. Questo approccio è descritto su mongoosejs.com credo.

Per quello che vale, l’ho fatto funzionare. Vedere la mia modifica sopra che ha funzionato dopo aver aggiunto un [] al nome del feed: "feed[0][name]" and "feed[0][key]" , quindi "feed[1][name]" and "feed[1][key]" . Grazie Chance per alcune buone idee. Per me non ha funzionato per mettere quella logica nel percorso ‘get’, doveva essere nel ‘post’. Grazie mille.