2017-07-31 2 views
0

Vous disposez actuellement d'un concept de diaporama et de différents types de diapositives. Je tente de remplir un tableau slides sur un objet de diaporamas avec un ensemble de références dynamique comme type de diapositive pour obtenir un tableau rempli de diapositives avec différents documents. Sous le titre "Références dynamiques", les codes de http://mongoosejs.com/docs/populate.html correspondent à ceux de mon document.Utilisation de Mongoose Dynamic Populate avec un résultat inattendu

// Abreviated slideshow model 
var slideshowSchema = mongoose.Schema({ 
    slides: [{ 
     slideType: String, 
     item: { 
      type: Schema.Types.ObjectId, 
      refPath: 'slides.slideType' 
     } 
    }] 
}] 


// controller get route 
app.get('/slideshow/:id', function(req, res, next) { 
    var id = req.params.id; 
    if(id){ 
     Slideshow 
      .findById(id) 
      .populate('slides.item') 
      .exec(function(err, slideshow) { 
       res.writeHead(200, { "Content-Type": "application/json" }); 
       res.end(JSON.stringify(slideshow)); 
      }); 
    } 
    else{ 
     return next(); 
    } 
}); 


// type of slide trying to be populated 
var currentWeatherSchema = mongoose.Schema({ 

    slideType: { 
     type: String, 
     required: true 
    }, 

    slideshowId: { 
     type: Schema.Types.ObjectId, 
     required: true 
    } 

    // other unique props 

}); 

Lorsque vous effectuez une Populate directe sur un slideType hardcoded, les diapositives peuplent comme prévu, et lors de l'exécution du code ci-dessus je reçois une réponse, et le tableau de diapositives est rempli avec la bonne quantité d'objets, mais ils ressembler à ceci au lieu du document prévu:

"slides": [ 
    { 
     "_bsontype": "ObjectID", 
     "id": { 
      "type": "Buffer", 
      "data": [ 
       89, 
       126, 
       152, 
       150, 
       243, 
       157, 
       179, 
       147, 
       165, 
       23, 
       247, 
       56 
      ] 
     } 
    } 
] 

J'ai lu à travers les exemples innombrables fois, et ne peut pas savoir où je vais mal. Est-ce que quelqu'un a de l'expérience en la matière ou voit-il ce que je peux manquer?

Répondre

0

Il semble que votre remplissage retourne l'ObjectId stocké car une référence de collection n'a pas été trouvée (si elle était trouvée et que l'objet ne correspondait pas, elle retournerait null). Par conséquent, la valeur "slideType" dans votre document de collection n'a pas de référence de collection valide.

  • Créez un modèle pour chaque schéma.
  • Remplissez le slideType avec le nom que le modèle a été créé. Soyez prudent avec les majuscules.
  • Assurez-vous que l'objet ObjectId est le même pour la bonne référence.
0

Vous pouvez le faire avec un agrégat et (se détendre/recherche):

processus:

exploser votre tableau d'éléments dans chaque diapositive

résoudre chacun des éléments du tableau

groupe les éléments de résolution dans un champ de chaque diapositive

Quelque chose comme:

db.slideshowSchema.aggregate([ 
    { 
     $match: {_id: id} // find condition 
    }, 
    { 
     $unwind: "$slides" // explode slide array of each document 
    }, 
    { 
     $lookup: { // resolve dependencies, take object in mycrosscollections where mycrosscollections._id == $slides.item 
      from: "mycrosscollections", 
      "localField": "$slides.item", 
      "foreignField": "_id", 
      "as": "resolveSlides" 
     } 
    }, 
    { 
     $group : { // push back resolve items in slides fields, and regroup by document id 
      _id: "$_id", 
      slides: {$push: "$resolveSlides"} 
     } 
    } 
])