0

I am trying to add tags to existing tags in a MongoDB collection with this Schema:

const workSchema = new mongoose.Schema({
  title: {
    type: String,
    required: "Tile can't be blank"
  },
  description: {
    type: String
  },
  imageURL: {
    type: String,
    unique: true
  },
  workURL:{
    type: String,
    unique: true
  },
  tags:{
    type:Array
  },
  createdDate: {
    type: Date,
    default: Date.now
  }

});

const Work = mongoose.model('Work', workSchema);
module.exports = Work;

I made an API that makes a PUT request to "/api/work/:workId/tags"

exports.updateTags = (req, res) =>{
  try{
    const newTags = req.body.tags.split(',');
    newTags.forEach(tag => {
      db.Work.update(
        {"_id": req.params.workId},
        {
          $push:{
            tags: tag
          }
        }
      )

    })
    res.status(200).send({message : "tags updated"})
  }
  catch(error){
    res.status(400).send(error)
  }

}

request.body:

{
  tags:"a,b,c"
}

The problem is that the array won't update with the new tag values

I searched for other ways to update in the docs and on the web but I didn't find any solutions.

1 Answer 1

2

You haven't defined _id in your workSchema so the type of _id would be ObjectId

But req.params.workId is probably a String, so querying an ObjectId with a String won't work.

So you should convert req.params.workId to ObjectId using mongoose.Types.ObjectId

{ "_id": mongoose.Types.ObjectId(req.params.workId) }

But you can improve your code a bit more by using .findByIdAndUpdate and $each operator

  • .findByIdAndUpdate will automatically convert your _id to ObjectId
  • You can use $each to $push multiple array elements at the same time without using .forEach
Work.findByIdAndUpdate(req.params.workId, {
  $push: { "tags": { $each: newTags } }
})
Sign up to request clarification or add additional context in comments.

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.