2013-08-21 10 views
0

Je suis en train de remplir des documents déjà peuplés:Nested remplir avec Mongoose

postModel 
    .findOne({ 
     _id: postId 
    }).select() 
    .populate('author') 
    .populate('sharedBy') 
    .populate('replies') 
    .exec(function(err, post) { 
     if (err) return err; 

Cependant, le tableau replies tiendra un tas de messages qui ont author et sharedBy clés que je dois aussi remplir. Ceci est ma stratégie:

.populate('author') 
    .populate('sharedBy') 
    .populate('replies') 
    .exec(function(err, post) { 
     if (err) return err; 
     post.deepPopulate(function(err, post){ 

Et deepPopulate:

PostSchema.method('deepPopulate', function(cb) { 
    var post = this; 
    async.map(this.replies, function(reply, done) { 
     mongoose.model('Post', PostSchema).findOne({ 
      _id: reply._id 
     }).select().populate('author').populate('sharedBy').exec(done); 
    }, function(err, replies) { 
     post.replies = replies; 
     cb(err, post); 
    }); 
}); 

Il trouve l'amende replies mais je ne peux pas sembler les remettre dans le message original qui a été passé! Des idées?

Répondre

1

Le message est un Mongoose Document, ce qui signifie que vous ne pouvez pas remplacer des propriétés comme celles que vous avez. La solution rapide consiste à appeler le .toObject sur la publication, puis à remplacer les réponses.

var postObj = post.toObject() 
postObj.replies = replies; 
cb(err, postObj); 

toObject transforme le document mangouste dans un objet régulier de sorte que vous pouvez écraser ses propriétés. Le négatif ici est que, à partir de là, vous ne pouvez pas utiliser les méthodes Mongoose sur le poste. Je ne peux pas m'empêcher de penser qu'il y a une meilleure façon de le faire.