Digamos que tengo un esquema de Lesson
y contiene una serie de subdocumentos de question
. ¿Cómo obtendría esas lecciones donde está marcado como completado pero todas las preguntas en la matriz se han isDeleted: true
Pensé en algo como
Lesson.find({ isComplete: true, 'questions.isDeleted': true })
pero eso obtiene las lecciones si se elimina al menos una de las preguntas. ¿Cómo afirmaría la condición para todas las preguntas?
No puede usar la dot notation
de puntos ya que aplana la matriz. Lo que puede hacer es usar $expr , esto permite el uso de aggregation operators
, como $reduce .
Ahora podemos iterar sobre la matriz y ver si todos los documentos cumplen las condiciones, así:
db.collection.find({ isComplete: true, $expr: { $eq: [ { $reduce: { input: "$questions", initialValue: 0, in: { $sum: [ "$$value", { $cond: [ { $ne: [ "$$this.isDeleted", true ] }, 1, 0 ] } ] } } }, 0 ] } })