简体   繁体   中英

MongoDB / NodeJS can't push to array

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.

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 } }
})

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM