Search code examples
node.jsmongodbmongoosepostmanmongoose-schema

post author Id turn into author username in node js for mongodb


i am trying to have my post's author's name in frontend. so i want to find the post according to it's user Id. but in model schema i used obejct Id of user in post Schema. Here is my userSchema:

const mongoose = require('mongoose');

// user schema
const userSchema = new mongoose.Schema(
  {
    email: {
      type: String,
      trim: true,
      required: true,
      unique: true,
      lowercase: true
    },
    name: {
      type: String,
      trim: true,
    },
    password: {
      type: String,
      required: true
    },
    salt: String,
bio: {
    type: String,
    trim: true
  },
    role: {
      type: String,
      default: 'subscriber'
    },
    
    resetPasswordToken: String, 
    resetPasswordExpire: Date,
  },
  {
    timestamps: true
  }
);


module.exports = mongoose.model('User', userSchema);

here is my postSchema model:

const mongoose = require("mongoose");

const PostSchema = new mongoose.Schema({
    title: {
        type: String,
        required: true,
      },
    
      content: {
        type: String,
        required: true,
      },
      comments: [{
        text: String,
        created: { type: Date, default: Date.now },
        postedBy: { type: mongoose.Schema.ObjectId, ref: 'User'}
      }],
      created: {
        type: Date,
        default: Date.now
      },
      creator: {
        type: mongoose.Schema.Types.ObjectId,
        ref: "User",
        
      },
    },
    {
      timestamps: true,
    },
    );
    

const Post = mongoose.model("Post", PostSchema);

module.exports = Post;

and here is my router for post lists by a specific user id:

exports.postByUser=async(req,res)=>{
  
  try
  {
    const userID=async()=>{
      await User.findById({ _id:req.params.id})
     .then(posts=>{
       res.status(200).json(posts.name)
       
     })
   }  

   await Post.find({creator: req.params.id})
    .then(posts=>{
      res.status(200).json(posts)

    })
   }catch(error){
    res.status(500).send({error: error.message});
  };
}

router.route('/post/mypost/:id').get(requireSignin,postByUser);

my target is to get a post list where every post's creator would have the user name. how can i achieve that in nodejs?


Solution

  • i have solved this way:

    exports.postByUser=async(req,res)=>{  
      try
      {
        await Post.find({creator: req.params.id})
        .populate({path:'creator', select:'name -_id'})
        .then(post=>{
          res.status(200).json(post)    
        })
    
       }catch(error){
        res.status(500).send({error: error.message});
      };
    }
    

    and it worked