我有这个功能来保存新记录或更新现有项目:
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 函数时,出现此错误:
The replacement document must not contain atomic operators.
我不明白我的错误在哪里。
感谢您的帮助
最佳答案
我敢打赌,您的更新文档,无论是 doc
还是 employ
,都包含更新操作 ($set: {...}
)。
顾名思义,findOneAndReplace 替换文档的内容,因此此处不允许更新运算符。
您很可能需要使用 findOneAndUpdate此处或确保您的更新文档包含完整的新记录。
引用这篇文章What's the difference between findOneAndUpdate and findOneAndReplace?和这篇文章MongoDB findOneAndDelete findOneAndUpdate findOneAndReplace也了解详细信息。
关于node.js - 替换文档不得包含原子运算符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66479023/