Pido disculpas por mi mala manera de explicar mi problema. Estoy tratando de actualizar las notas de mi esquema y los campos del historial de asignaciones. No tengo problemas para actualizar el campo de notas, pero con el campo de historial de asignaciones, lo que estoy tratando de hacer es agregar valores a la matriz solo si el valor asignado a ha cambiado desde su último valor o no está vacío solo entonces $ empujar a la matriz de historial de asignaciones, de lo contrario, no No agregue nada a la matriz de historial de asignaciones. Básicamente, ¿cómo evito que $push no agregue nada a la matriz del historial de asignaciones, ni siquiera un objeto vacío con el campo _id? A continuación se muestra un fragmento de mi código
const RequestSchema = new Schema( { title: { type: String, required: true, max: 32, min: 6 }, priority: { type: String, emum: ["low", "medium", "high"] }, notes: [ { commentNotes: { comment: { type: String, max: 200 }, commentBy: { type: Schema.Types.ObjectId, ref: "User" }, commentDate: { type: Date }, } ] assignedTo: { type: Schema.Types.ObjectId, ref: "User" }, assigmentHistory: [ { techName: { type: Schema.Types.ObjectId, ref: "User" }, assignedDate: { type: Date }, } ] } let noteObj={}; let techobj={}; await RequestModel.findOneAndUpdate( { _id }, { $push: { notes: [noteObj], assignmentHistory:[techobj] }, }, { new: true } );Para insertar solo un elemento en una matriz si el valor aún no está presente, puede usar $addToSet . Vea este ejemplo en mongoplayground . Con respecto al manejo del objeto vacío, simplemente lo haría en el lado del cliente y construiría dinámicamente la consulta. Entonces algo como:
const addToSetObj = {}; if(!isEmpty(noteObj)) { // use one of the method for isEmpty described here https://stackoverflow.com/q/679915/3761628 pushObj.notes = noteObj; } if(!isEmpty(techObj)) { pushObj.assignmentHistory = techObj; } await RequestModel.findOneAndUpdate( { _id }, { $addToSet: addToSetObj }, { new: true } );Tengo una solución alternativa, pero me gustaría una forma más profesional de evitar agregar objetos vacíos al campo de matriz.
Básicamente, solo quería enviar un objeto al campo de matriz de historial de asignación de mi esquema si la variable asignado a era verdadera. Good Programming no recomienda usar el mismo código dos veces, pero en mi caso he usado la consulta findoneAndUpdate dos veces en la condición if y else. Por favor, siéntase libre de optimizarlo. Todo lo que quiero es cuando la variable asignado a es falsa, entonces $addToSet no agrega un objeto vacío en el campo de matriz de historial de asignaciones.
if ( assignedTo && assignedTo.toString() !== oldRequest.assignedTo.toString() ) { await RequestModel.findOneAndUpdate( { _id }, { $set: requestFields, $push: { notes: [noteObj], }, $addToSet: { assigmentHistory: [newtech_info_object] }, }, { new: true } ); } else { await RequestModel.findOneAndUpdate( { _id }, { $set: requestFields, $push: { notes: [noteObj], }, }, { new: true } ); }