overwrite:true在MongoDB中的FindOneAndUpdate中不起作用

dffbzjpn  于 2023-03-17  发布在  Go
关注(0)|答案(1)|浏览(136)

下面是我的架构和API
架构. js文件

const  structure = new mongoose.Schema({
    Name: {
        type:String,
        required:[true,"Please Enter Task"],
    },
    Completed: {
        type:Boolean,
        default:false
    }
})

let work = mongoose.model('tasks',structure)     

module.exports = work

我已经将其导入到API文件中,并编写了一个api来更新记录

const work = require("../models/schema.js")

async function updateone(req,res)
{   
    console.log(req.body)
    try {
        let treat = {"First" :"Michael" }
        let newtask =  await 
        work.findOneAndUpdate({_id:req.params.id},treat,{ overwrite: true })   
        res.status(200).json(newtask)
    } 
    catch (error) {
        res.status(500).json({status:"Fail",msg:"Wrong Parameter"})
    }
}

现在,我想在更新时,只有名称应保留和Completed字段不应该有。我知道, Mongoose 默认 Package 在$set,因此我使用overwrite:true,使我的整个文档将被替换。
然而,我看到值Name被替换,但Completed字段仍然存在。我还注意到,如果我提供一个全新的字段,那么什么都不会改变。这意味着如果:-

let treat = {"Job" :"Pilot" }
let newtask =  await work.findOneAndUpdate({_id:req.params.id},treat,{ overwrite: true })

在这种情况下,没有任何变化,根本没有添加新字段。我在这里做错了什么?

dgsult0t

dgsult0t1#

使用findOneAndReplace

async function updateone(req, res) {
  console.log(req.body);
  try {
    let treat = { First: 'Michael' };
    let newtask = await work.findOneAndReplace({ _id: req.params.id }, treat, {
        returnDocument: 'after'
    });
    res.status(200).json(newtask);
  } catch (error) {
    res.status(500).json({ status: 'Fail', msg: 'Wrong Parameter' });
  }
}

相关问题