skip to Main Content

I am trying to update the like count of job posts in my application using the $inc operator and the findByIdAndUpdate method from Mongoose. The correct document is being retrieved and returned but the like count for the job post never moves up from 0 and no updates are performed in the database collection.

Below is the code I am currently using to perform the update.

Jobs.findByIdAndUpdate(req.params._id , { $inc: {likes: 1}} , {new: true})
.then((ret) => {
    res.send(ret)
})

Job schema

const mongoose = require('mongoose');

let JobSchema = mongoose.Schema({
    student_name: {
        type: String,
        required: true
    },
    subject: {
        type: String,
        required: true
    },
    grade: {
        type: Number,
        required: true
    },
    area: {
        type: String,
        required: true
    },
    desc: {
        type: String,
        required: true
    },
    accepted: {
        type: Boolean,
        required: true,
        default: false
    },
    tutor_name: {
        type: String,
        required: false
    },
} , {collection: 'jobs'});

let Job = mongoose.model('Job' , JobSchema);
module.exports = Job;

Any insight into what is preventing the update from performing would be greatly appreciated

I have tried using two queries, one to retrieve the current likes of a post and another to manually update the doc with the incremented value. I have tried nesting the queries using .then() statements and have also tried the updateOne() and findOneAndUpdate() methods as alternatives. I have tried experimenting with the $set and $inc operators in my queries to see if either of them perform the changes, but neither do.

I am expecting the incremented ‘likes’ value to be reflected in the database and for the updated job document to be returned and echoed back to the console.

2

Answers


  1. Can you try something like this (adding [] around update):

    Jobs.findByIdAndUpdate(req.params._id , [{ $inc: {likes: 1}}] , {new: true})
    .then((ret) => {
        res.send(ret)
    })
    

    EDITED:

    Jobs.findByIdAndUpdate(req.params._id , [{ $set: {likes: "$likes"+1}}] , {new: true})
    .then((ret) => {
        res.send(ret)
    })
    
    Login or Signup to reply.
  2. Your schema is missing a likes field, which means Mongoose will remove it from queries/updates (since it doesn’t match the schema). Make sure to add it:

    likes: {
      type: Number,
      default: 0
    }
    
    Login or Signup to reply.
Please signup or login to give your own answer.
Back To Top
Search