【问题标题】:MongoDB / NodeJS can't push to arrayMongoDB / NodeJS 无法推送到数组
【发布时间】:2020-05-11 01:57:35
【问题描述】:

我正在尝试使用此架构将标签添加到 MongoDB 集合中的现有标签:

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;

我创建了一个向“/api/work/:workId/tags”发出 PUT 请求的 API

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

问题是数组不会用新的标签值更新

我在文档和网络上搜索了其他更新方式,但没有找到任何解决方案。

【问题讨论】:

    标签: javascript node.js mongoose mongoose-schema


    【解决方案1】:

    您尚未在 workSchema 中定义 _id,因此 _id 的类型将是 ObjectId

    req.params.workId 可能是String,因此用String 查询ObjectId 将不起作用。

    所以你应该使用mongoose.Types.ObjectIdreq.params.workId 转换为ObjectId

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

    但是您可以使用 .findByIdAndUpdate$each 运算符进一步改进您的代码

    • .findByIdAndUpdate 将自动将您的 _id 转换为 ObjectId
    • 您可以同时使用$each$push 多个数组元素,而无需使用.forEach
    Work.findByIdAndUpdate(req.params.workId, {
      $push: { "tags": { $each: newTags } }
    })
    

    【讨论】:

      猜你喜欢
      • 2016-12-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-09-26
      相关资源
      最近更新 更多