Mi esquema de Mongo se ve así, quiero actualizar un objeto de flashcard ubicado en una matriz de flashcard también ubicada en una matriz de subject .
const classrooms = new mongoose.Schema({ name: String, year: String, student: [ { firstname: String, lastname: String, mail: String, userId: String, } ], subject: [ { subjectId: String, flashcard: [ { title: String, tag: [] } ] } ] });lo que estoy haciendo es
const flashcard = await classroomModel.findOneAndUpdate({ _id : classroomId, "subject" : { "subjectId" : subjectId, "subject.flashcard" : { "_id" : flashcardId } }, "$set" : { "flashcard.title" : "new title" } })Pero esto es borrar todas las flashcards ubicadas dentro de un objeto. Cualquier ayuda sería apreciada.
NecesitaarrayFilters para especificar el documento de flashcard (que se actualizará) que cumpla con los criterios para el subject y la flashcard .
db.collection.update({ _id: 1//classroomId, }, { "$set": { "subject.$[subject].flashcard.$[flashcard].title": "new title" } }, { arrayFilters: [ { "subject.subjectId": 1//subjectId }, { "flashcard._id": 1//flashcardId } ] })Aunque acepté @yong shun, que es el mejor enfoque, otra forma de hacerlo en caso de que no le guste la sintaxis de mangosta:
const classroom = await classroomModel.findOne( { _id: 1 //classroomId, }, ) const subject = classroom.subject.find( (currentSubject: any) => { return currentSubject.subjectId == 1 //subjectId } ) const flashcard = subject.flashcard.find( (currentFlashcard: any) => { return currentFlashcard._id == 1 //flashcardId } ) flashcard.title = "my new title"; await classroomModel.updateOne(classroom);