Whisher
Whisher

Reputation: 32806

mongoosejs findByIdAndUpdate a best way

I'm wondering if there a best way to do this:

/**
 * Article Schema
 */
var PostSchema = new Schema({
    title: {
        type: String,
        required: true,
        trim: true
    },
    author:{
        type: String,
        required: true,
        default: 'whisher'
    },
    slug: {
        type: String,
        index: { unique: true }
    },
    body: {
        type: String,
        required: true,
        trim: true
    },
    avatar:{
        type: String,
        required: true
    },
    status: {
        type: String,
        required: true,
        trim: true
    },
    created: {
        type: Date,
        required: true,
        default: Date.now
    },
    published: {
        type: Date,
        required: true
    },
    categories: {
        type: [String]
    },
    tags: {
        type: [String], 
        required: true,
        index: true
    },
    comment: {
        type: Schema.Types.ObjectId, 
        ref: 'CommentSchema'
    },
    meta: {
        votes: {
            type: Number,
            default: 0
        },
        comments: {
            type: Number,
            default: 0
        } 
    }
});
/**
 * Comment Schema
 */
var CommentSchema = new Schema({
    post_id: {
        type: Schema.Types.ObjectId,
        ref: 'Post',
        required: true
    },
    author:{
        type: String,
        required: true
    },
    email:{
        type: String,
        required: true
    },
    web:{
        type: String
    },
    body: {
        type: String,
        required: true,
        trim: true
    },
    status: {
        type: String,
        required: true,
        default: 'pending'
    },
    created: {
        type: Date,
        required: true,
        default: Date.now
    },
    meta: {
        votes: Number
    }
});
/**
 * Create a comment
 */
exports.create = function(req, res) {
    var comment = new Comment(req.body);
    comment.save(function(err) {
        if (err) {
           return res.jsonp(500,{ error: 'Cannot save the comment' });
        } 
        Post.findById(comment.post_id).exec(function(err, post) {
            if (err) {
               return res.jsonp(404,{ error: 'Failed to load post with id ' + comment.post_id });
            }
            if (!post) {
                return res.jsonp(404,{ error: 'Failed to load post with id ' + comment.post_id });
            }
            post.meta.comments = post.meta.comments++;
            post.save(function(err) {
                if (err) {
                    return res.jsonp(500,{ error: 'Cannot update the post' });
                } 
                res.jsonp(200,comment);
            });
        });
    });
};

Btw I just looking at http://mongoosejs.com/docs/api.html#model_Model.findByIdAndUpdate

but like this:

Model.findByIdAndUpdate(comment.post_id, { post.meta.comments: post.meta.comments++ })

doesnt work

Upvotes: 2

Views: 6103

Answers (1)

nabeel
nabeel

Reputation: 961

I think you need to use the $inc operator to increment the comment count like this...

Post.findByIdAndUpdate(comment.post_id, { $inc: {"meta.comments" : 1} }, callback);

Upvotes: 3

Related Questions