2017-01-27 4 views
0

Coding eine Nachrichten/Medien-Website definieren, ich möchte eine Rubrik „News“, „Reviews“ Abschnitt, ein „Trending“ Abschnitt, der sowohl in den vorherigen Abschnitten kombiniert, so wie hier: enter image description here Ich habe gemacht ein Schema für "News", eins für "Reviews". Wie kann ich einen "Trending" Abschnitt (wie im Bild oben "Filme" Abschnitt) machen? Code: In app.js,MongoDB Schema

//LANDING PAGE 
    app.get('/', function (req, res,next) { 
     Blogdemo.find({}).sort([['_id', -1]]).limit(3).exec(function(err,allBlogs) { //finds latest posts for 1st Schema (upto 3) 
      if(err) {  
       console.log(err); 
       next(); 
      } else { 
       res.locals.blog = allBlogs; 
       // res.render("landing", {blog : allBlogs , moment : now}); 
       next(); 
      } 

     }) 

}, function (req, res) { 
    Review.find({}).sort([['_id', -1]]).limit(3).exec(function(err,allReviews) { //finds latest posts of 2nd Schema 
       if(err) { 
        console.log(err); 
       } else { 
        res.locals.review = allReviews; 
        res.render("landing", res.locals); 
       } 
    }) 
}) 

In review.js,

var mongoose = require("mongoose"); 

//SCHEMA SETUP 
var reviewSchema = new mongoose.Schema({ 
    image : String, 
    title : String, 
    body : String, 
    rating : String, 
    created : {type : Date, default : Date.now()}, 
    comments: [ 
     { 
     type: mongoose.Schema.Types.ObjectId, 
     ref: "Comment" //name of the model 
     } 
    ] 
}) 

module.exports = mongoose.model("review", reviewSchema); 

Das "News" Schema ist fast das gleiche (keine Bewertung). Ist meine Art, das Schema zu definieren falsch? Wenn nicht, wie kann ich den Abschnitt "Trending" erstellen?

Gibt es irgendeine mongodb-Methode, die die neuesten Beiträge von "News" und "Reviews" finden kann, um die "Trending" -Sektion zu erstellen (genau wie im 1. Bild)?

+0

haben Sie ein Schema für den Trendabschnitt definiert? –

+0

Auch können Sie mir das Schema der Überprüfung und Nachrichten zeigen, so dass ich Ihnen mit dem Abschnitt "Trending" helfen kann. –

+0

Ich habe kein Schema für den Trend definiert. Ich habe den Code in der Frage aktualisiert. – eknoor4197

Antwort

1

Von was ich aus Ihrem Code sehen kann, sieht Ihr aktuelles News und Review Schema gut aus.

Sie müssen einen weiteren Schema für Trending definieren.

var TrendingSchema = new mongoose.Schema({ 
    referenceId : { 
     type : mongoose.Schema.Types.ObjectId 
    }, 
    postType : String //To store News or Reviews 
}); 

Während neue News oder Reviews zu speichern, legen Sie die _id der neu gespeicherte Dokument in der trending Sammlung.

var news = new News(); 
news.image = newsImage; 
... 
news.save(function(err,result) 
{ 
    if(!err) 
    { 
     var trending = new Trending(); 
     trending.referenceId = result._id; 
     trending.postType = "News"; 
     treding.save(function(err) 
     { 
      if(!err) 
      { 
       //success response 
      } 
      else 
      { 
       //error response 
      } 
     }); 
    } 
    else 
    { 
     //send error response 
    } 
}); 

ähnlich beim Speichern Bewertung Beitrag

var review = new Review(); 
review.image = reviewImage; 
... 
review.save(function(err,result) 
{ 
    if(!err) 
    { 
     var trending = new Trending(); 
     trending.referenceId = result._id; 
     trending.postType = "review" 
     treding.save(function(err) 
     { 
      if(!err) 
      { 
       //success response 
      } 
      else 
      { 
       //error response 
      } 
     }); 
    } 
    else 
    { 
     //send error response 
    } 
}); 

So jetzt Trending Sammlung enthalten wird, neu gespeicherte News oder Review, in der Reihenfolge, wie sie created sind. So werden Sie in der Lage sein, neue Review oder News Post zu bekommen.

Während Trending holen, können Sie sie News oder ReviewSchema mit populate basierend auf dem postType.

Trendign.find({}).limit(10).exec(function(err,result) 
{ 
    if(!err && result.length!=0) 
    { 
     var trendingPosts = []; 
     result.forEach(function(trending){ 
      if(trending.postType === "News"){ 
       trending.populate({path : 'referenceId',model : 'News'},function(err,populatedItem) 
       { 
        if(!err) 
        { 
         trendingPosts.push(populatedItem); 
        } 
       }); 
      } 
      else if(trending.postType === "Review"){ 
       trending.populate({path : 'referenceId',model : 'Review'},function(err,populatedItem) 
       { 
        if(!err) 
        { 
         trendingPosts.push(populatedItem); 
        } 
       }); 
      } 
     }); 
     //now send the trendingPost array with latest News and Review Posts 
    } 
    else 
    { 
     //send Error response 
    } 
}); 

Jetzt können Sie die neueste News oder Review zeigen und die Art postType schreiben.

Hoffe, das ist was du willst.

Verwandte Themen