I'm programming a model for a blog with authors and posts. I was following this doc: Mongoose Query Population
My concern is that the createPost function is inefficient. Another option is to nest the posts in the Author, but how I will get all posts? Should I use MySQL? Am I doing it right? (Take a look at the functions as well)
Some more details:
let mongoose = require("mongoose");
let Schema = mongoose.Schema;
let PostSchema = Schema({
title: {type: String},
body: {type: String},
date: {type: Date},
tags:[{type: String}],
_author: {type: Schema.Types.ObjectId, ref: 'author'}
});
let AuthorSchema = Schema({
name: {type: String},
photo: {type: String},
bio: {type: String},
username: {type: String, index: true},
posts:[{type: Schema.Types.ObjectId, ref: 'post'}],
password: {type: String}
});
let Author = mongoose.model('author', AuthorSchema);
let Post = mongoose.model('post', PostSchema);
module.exports = Author;
module.exports = Post;
module.exports.createAuthor = (newAuthor, callback)=>{
newAuthor.save(callback)
};
module.exports.createPost = (username, newPost, callback)=>{
Author.findOne({username:username}).then((author)=>{
newPost._author = author._id
author.posts.push(newPost);
newPost.save().then(err, auth)=>{
author.save(callback);
};
},(err)=>{
if(err)
throw err;
});
};
module.exports.getAuthorByPostTitle = (postTitle, callback)=>{
Post.findOne({title:postTitle}).populate('_author').exec((err, post)=>{
if(err)
throw err;
else
return post._author;
});
};
module.exports.getPostsByAuthorId = (authorId, callback)=>{
Post.find({_author:authorId}).exec((err, posts)=>{
if(err)
throw err;
else
return posts;
});
};
1 Answer 1
You can use the forEach
function like this
const allPosts = [];
Author.find({}, function(err, users) {
if (err) throw err;
users.forEach(function(user) {
const a = user.posts;
a.forEach(us => allPosts.push(us));
});
});
Now the allPosts
array will have all the posts.
-
\$\begingroup\$ It would have been better to edit your first answer, rather than posting a new. You can see the
[edit]
and[delete]
links below the text of your posts. \$\endgroup\$janos– janos2018年01月03日 12:06:29 +00:00Commented Jan 3, 2018 at 12:06 -
\$\begingroup\$ Ok, that would solve the problem of querying all posts \$\endgroup\$masterjohn12– masterjohn122018年01月03日 23:36:29 +00:00Commented Jan 3, 2018 at 23:36
-
\$\begingroup\$ What do you think about the createPost function? \$\endgroup\$masterjohn12– masterjohn122018年01月03日 23:36:53 +00:00Commented Jan 3, 2018 at 23:36
Explore related questions
See similar questions with these tags.