Search code examples
node.jsmongoosemongoose-schema

How to poulate a a field in a mongoose schema which is refrenced to another schema , and this schema is further refrenced to another schema?


The field (viewed_posts) i want to populate in User Schema:

viewed_posts: [
    {
      type: mongoose.Schema.Types.ObjectId,
      ref: "Viewed"
    }
  ]

Viewed Schema :

var viewedSchema = new mongoose.Schema({

    hitsByUser: {type: Number, default: 0},
    viewsByUser: {type: Number, default: 0},
    post: {
      type: mongoose.Schema.Types.ObjectId,
      ref: "Post"
    }
  
});

Post Schema :

var mongoose = require('mongoose');

var passportLocalMongoose = require("passport-local-mongoose");
var uniqueValidator = require('mongoose-unique-validator');
var marked = require('marked');
var slugify = require('slugify');
// this is done for sanitizing html so that user cannot write a script in the input
const createDomPurify = require('dompurify')
const {JSDOM} = require('jsdom')
const dompurify = createDomPurify(new JSDOM().window)


var postSchema = new mongoose.Schema({
  postNumber: Number,
  title: String,
  content: String,
  subject: String, // currently we have 4 subjects so one out of 4 subjects will be stored here
  likes: {type:Number,default:0},
  // likes: {
  //   id:{
  //     type: mongoose.Schema.Types.ObjectId,
  //     ref: "User"
  //   }
  // },
  views: {type:Number,default:0},
  actualViews: {type:Number,default:0},
  shares: Number,
  isReviewedByAdmin: {type: Boolean, default: false},
  isReviewedByAuditor: {type: Boolean, default: false},
  author: {
    id:{
      type: mongoose.Schema.Types.ObjectId,
      ref: "User"
    },
    username: {
      type: String
    }
  },
  publish_date: {
    type: String, 
    default: Date.now
  },
  publishDay: String,
  slug: {
    type: String,
    required: true,
    
  },
  sanitizedHtml: {
    type: String,
    required: true
  },
  
  imagename: String                                        //2002-12-09
});

I wish to see whole structure printed , but i can only populate viewed_posts, how can i populate "post" which is inside viewed Schema and see here:

User.findById(req.user._id).populate("viewed_posts").exec((err,ans)=>{
                  if(err) console.log(err)
                  else{
                    
                    
                    console.log("this is the answer ",ans)
                 }})

The output i get:

 },
    {
      hitsByUser: 0,
      viewsByUser: 0,
      _id: 5f9e85aeec37700f54a4d029,
      post: 5f9a93d38d7cf8544ce9cc21,
      __v: 0
    },
    {
      hitsByUser: 0,
      viewsByUser: 0,
      _id: 5f9e85d61841000478c85f8a,
      post: 5f82773f1998150024d4c8fc,
      __v: 0
    },

But i expect this post to be expanded too, instead of just showing id , How can i achieve it. Any Help Would be appreciated.


Solution

  • Mongoose supports nested populating (see in the docs: https://mongoosejs.com/docs/populate.html#deep-populate). Note that you have to specify your model name of post schema where I´ve put the "post-model-name" placeholder.

    So you could try something like this:

    User.findById(req.user._id)
      .populate({ 
         path: 'viewed_posts',
         populate: {
           path: 'post',
           model: 'post-model-name'
         } 
      })
      .exec();