【问题标题】:The replacement document must not contain atomic operators替换文档不得包含原子运算符
【发布时间】:2021-03-04 16:22:10
【问题描述】:

我有这个功能来保存新记录或更新现有项目:

async function saveEmploy(c){
let employ=new collaboratore();
employ=c;
let docs=c.documenti.length>0?c.documenti:undefined;
if(docs!==undefined){
    let oldDocs=docs.map(d=>{if (d._id) d;});
    oldDocs.forEach(async d=>{
        let oldDoc=await documento.findOneAndReplace({_id:doc._id},doc,{upsert:true});
        employ.documenti.push(oldDoc._id);
    });
    let newDocs=docs.map(d=>{if(!d._id)d;});
    newDocs.forEach(async d=>{
        let newDoc=await d.save();
        employ.documenti.push(newDoc._id);
    });
}

let savedEmploy=null;
if(c._id){
    savedEmploy=await collaboratore.findOneAndReplace({_id:c._id},employ,{new:true,upsert:true});
}
else
    savedEmploy=await employ.save();
console.log('saved');
return savedEmploy;
}

这些是架构:

const collaboratoreschema =new schema({
   dataregistrazione:{type:Date,default:Date.now},
   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,set:v=>!v || v.length===0?undefined:v},
   telefoni:{type:[telefonoschema],required:true},
   indirizziemail:{type:[require('../email.schema.js')],set:v=>!v || v.length===0?undefined:v},
   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,set:v=>!v || v===''?undefined:v},
   immagine:imageEmbeddedSchema,
   documenti:[{type:schema.Types.ObjectId,ref:'tbFiles'}],
   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,collection:'tbCollaboratori'});

当我执行 findOneAndReplace 函数时,我得到这个错误:

替换文档不能包含原子操作符。

我不明白我的错误在哪里。

感谢您的帮助

【问题讨论】:

    标签: node.js mongodb mongoose


    【解决方案1】:

    我敢打赌,您的更新文档,docemploy,包含更新操作 ($set: {...})。
    顾名思义,findOneAndReplace替换文档的内容,所以这里不允许更新操作符。
    很可能您需要在此处使用findOneAndUpdate 或确保您的更新文档包含完整的新记录。
    详情请参考这篇文章What's the difference between findOneAndUpdate and findOneAndReplace?和这篇文章MongoDB findOneAndDelete findOneAndUpdate findOneAndReplace

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-12-17
      • 2019-04-17
      • 2017-06-14
      • 2017-02-05
      相关资源
      最近更新 更多