Mongodb架构定义

时间:2017-01-27 16:12:53

标签: node.js mongodb mongoose

编辑新闻/媒体网站,我想要一个"新闻"部分,"评论"部分,a "趋势"部分,结合了前面几节,就像这里: enter image description here 我为"新闻"制作了一个模式,一个用于"评论"。我如何制作一个"趋势"部分(如上图所示"电影"部分)? 代码: 在app.js中,

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

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

"新闻"架构几乎相同(没有评论)。 我定义架构的方式是错误的吗?如果没有,那么我该如何构建"趋势"部?

是否有任何mongodb方法可以找到来自"新闻"和"评论"建立"趋势"部分(就像在第1张图片中一样)?

1 个答案:

答案 0 :(得分:1)

从我的代码中可以看到,您当前的NewsReview架构看起来很不错。

您需要为Schema定义另一个Trending

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

在保存新的NewsReviews时,请在_id集合中插入新保存文档的trending

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

同样保存Review Post

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

因此,现在Trending集合将按照News的顺序包含新保存的Reviewcreated。因此,您将能够获得新的ReviewNews帖子。

在提取Trending时,您可以populate使用NewsReview Schema postType {/ 1}}。

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

现在,您可以展示最新的NewsReview并写下postType类型。

希望这就是你想要的。

相关问题