【问题标题】:Mongoose not update the empty fieldsMongoose 不更新空字段
【发布时间】:2021-06-21 01:38:41
【问题描述】:

我有这个架构:

const collaboratoreschema =new schema({
//_id:schema.Types.ObjectId,
dataregistrazione:{type:Date,default:Date.now,immutable:true},
nominativo:nominativoschema,
localitanascita:{type:String,required:true,trim:true},
provincianascita:{type:String,required:true,trim:true},
datanascita:{type:Date,required:true},
indirizzoresidenza:{type:indirizzoEmbeddedSchema,required:true},
indirizzodomicilio:{type:indirizzoEmbeddedSchema},
telefoni:{type:[telefonoschema],required:true},
indirizziemail:{type:[require('../email.schema.js')],default:undefined},
codicefiscale:{type:String,required:true,uppercase:true,trim:true,match:/^[a-zA-Z]{6}[0-9]{2}[a-zA-Z][0-9]{2}[a-zA-Z][0-9]{3}[a-zA-Z]$/},
note:{type:String,trim:true},
immagine:{type:imageEmbeddedSchema,set:v=>!v || Object.keys(v).length===0?undefined:v},
documenti:{type:[{type:schema.Types.ObjectId,ref:'tbFiles'}],set:v=>!v || Object.keys(v).length===0?undefined:v},
datainiziorapporto:{type:Date,required:true},
datafinerapporto:Date,
riferimentoazienda:{type:schema.Types.ObjectId,ref:'tbFornitori',set:v=>!v || v==={} || v===''?undefined:v},
attivo:{type:Boolean,default:true},
},{timestamps:true,useNestedStrict: true, omitUndefined:true,collection:'tbCollaboratori'})

保存工作正常,但更新时出现问题。例如,将注释字段值设置为空,当我使用 await collaboratore.findByIdAndUpdate({_id:id},employ,{new:true,upsert:true}); 保存更改时,不保存更改,而如果我将值更改为非空值,它工作正常。 我希望删除空字段和未定义字段。

更新

这是我的更新控制器:

let employ=new collaboratore(); // collaboratore is my model
collaboratoreschema.eachPath(d=>{
    employ[d]=c[d]; //c is collaboratore from req.body
})
await collaboratore.findByIdAndUpdate({_id:id},employ,{new:true,upsert:true});

谢谢

【问题讨论】:

    标签: node.js mongodb mongoose


    【解决方案1】:

    刚试过。如果您能够使用下面的脚本进行复制,它对我来说工作正常。

    6.js

    const mongoose = require('mongoose');
    
    let UserSchema = new mongoose.Schema({
        email: {
            type: String,
        },
    });
    
    
    run().catch((err) => console.log(err));
    
    async function run() {
        await mongoose.connect('mongodb://localhost:27017/test', {
            useNewUrlParser: true,
            useUnifiedTopology: true,
        });
        await mongoose.connection.dropDatabase();
    
        const UserModel = mongoose.model('user', UserSchema);
        const newUser = { email: 'test@test.com' };
        const user = new UserModel(newUser);
        const {_id} = await user.save();
        const updatedUser = await UserModel.findOneAndUpdate({_id}, {$set: {email: ''}}, {new: true, upsert: true});
        console.log(updatedUser, 'updatedUser')
    }
    
    
    

    【讨论】:

    • 在更新时对每个属性使用 $set 对我来说似乎不太舒服。
    • 不,它没有。我正在考虑一种解决方法。使用 findOneAndReplace 方法
    • 每次都必须传递整个对象时使用 findOneAndReplace,因为它将替换您的原始文档
    • 当然可以,但是我在这件事上浪费了太多时间
    猜你喜欢
    • 2017-02-12
    • 1970-01-01
    • 1970-01-01
    • 2015-10-01
    • 2021-07-09
    • 2012-11-29
    • 2018-06-05
    • 2015-12-15
    • 2016-09-13
    相关资源
    最近更新 更多