0
\$\begingroup\$

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:

Pastebin

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;
        });
};
\$\endgroup\$
1
\$\begingroup\$

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.

\$\endgroup\$
  • \$\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 Jan 3 '18 at 12:06
  • \$\begingroup\$ Ok, that would solve the problem of querying all posts \$\endgroup\$ – masterjohn12 Jan 3 '18 at 23:36
  • \$\begingroup\$ What do you think about the createPost function? \$\endgroup\$ – masterjohn12 Jan 3 '18 at 23:36

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

Not the answer you're looking for? Browse other questions tagged or ask your own question.