2013-06-21 9 views
6

Ho un modello "Categoria". La raccolta categories contiene diversi oggetti. Ho anche un modello "Post". La raccolta posts può contenere molti oggetti con i post degli utenti. L'oggetto "Post" può riguardare 1+ categorie. Come collegare l'oggetto "Post" a 1+ "Categoria" -oggetti senza inserire "Post" -oggetto all'interno di "Categoria" -oggetto come documento secondario? Certo, ho bisogno di avere un'opzione per trovare tutti i post relativi a determinate categorie.Mongoose - collegamento di oggetti tra loro senza duplicare

Uno dei modi che posso immaginare è quello di memorizzare in "Post" - oggetto obj_id di tutte le categorie a cui è correlato. Smth come questo:

var postSchema = mongoose.Schema({ 
    title: String, 
    description: String, 
    category: [ObjectId], 
    created_time: Number, 
}) 

e aggiungere categoria dopo ...

post.category.push(obj_id); 

ma è davvero una mangusta a senso unico? Qual è il modo corretto? Grazie.

P.S. Ho anche letto sui metodi di popolamento nei documenti della mangusta, potrebbe essere utile nel mio caso? Per me non è ancora del tutto chiaro cos'è questo.

risposta

16

Populate è uno strumento migliore per questo poiché si creano relazioni molte a molte tra post e categorie. I documenti secondari sono appropriati quando appartengono esclusivamente all'oggetto padre. Sarà necessario modificare il postSchema ad utilizzare un riferimento:

var postSchema = mongoose.Schema({ 
    title: String, 
    description: String, 
    category: [{ type: Schema.Types.ObjectId, ref: 'Category' }], 
    created_time: Number, 
}); 

È possibile aggiungere categorie da documenti che spingono sulla matrice:

post.category.push(category1); 
post.save(callback); 

Poi li reidratare durante query utilizzando popolare:

Post.findOne({ title: 'Test' }) 
.populate('category') 
.exec(function (err, post) { 
    if (err) return handleError(err); 
    console.log(post.category); 
}); 
+0

grazie! Cosa dovrebbe essere esattamente categoria1 in 'post.category.push (category1);'? Dovrebbe essere String con objectID o smth altro? E un'altra domanda: cos'è "reidratare"? Cosa fa questo processo? Perché ne ho bisogno? –

+0

Dovrebbe essere un'istanza di modello di categoria effettiva. Per reidratazione intendo semplicemente inserire i riferimenti con i documenti effettivi anziché gli ID. –

Problemi correlati