'Schema field is not being populated using mongoose populate
Here is my model:
const postSchema = Schema({
_id: Schema.Types.ObjectId,
name: String,
comments: Array
});
const Post = mongoose.model(“Post”, postSchema);
module.exports = Post;
Here is my code making a request to another microservice to populate the comments array, but it is empty, and is not being populated:
const UserPost = require(“./PostSchema”);
router.get("/post/list", async (request, response) =>{
try {
let myUserPost = await UserPost.find();
let postComments = await Promise.all(
myUserPost.map((post) =>{
axios.get(`${process.env.COMMENTS_MICROSERVICE_URL}/router/comments/list/comments/by/post/${post._id}`)
.then((resp) => {
resp.data.message.map((comment) =>{
if(String(post._id) === comment.postID){
//console.log("post._id: ", post._id);
/*** Desired, but does not work
return UserPost.findById(post._id).populate('comments').exec(); */
//The following alternative (embedding) works but adds the data to array
/***return UserPost.findByIdAndUpdate(post._id, {$addToSet: {"comments": comment}}, (err, data) =>{
err ? console.log(err) : console.log("aa: ", data);
}); */
}else{
console.log("no")
}
});
})
})
);
return response.status(200).json({message: myUserPost});
}catch(err){
return response.status(400).json({message: `${err}`});
}
});
What’s the best way to go about this and have it populate the comments field?
Solution 1:[1]
- You are missing the
refattribute from the model declaration:
const postSchema = Schema({
_id: {
type: Schema.Types.ObjectId,
ref: 'comments'
},
name: String,
comments: Array
});
const Post = mongoose.model(“Post”, postSchema);
module.exports = Post;
- You should call
execafter thepopulatemethod.
UserPost.findById(post._id).populate('comments').exec();
Sources
This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.
Source: Stack Overflow
| Solution | Source |
|---|---|
| Solution 1 | lpizzinidev |
