mi colección tiene una estructura como esta:
"listQuestion": [ { "answer_type": 0, "listShortAnswer": [], "listQuestionChildren": [], "quiz_type": 1, "listPairing": [], "listAnswer": [ { "is_true": false, "answer_content": " \\[x=-2\\] ", "answer_url_image": "", "answer_url_mp3": "", "answer_id": 136948 }, { "is_true": true, "answer_content": " \\[x=-1\\] ", "answer_url_image": "", "answer_url_mp3": "", "answer_id": 136950 }, Tengo una variable de agregación llamada $$isShowAnswer , si es true , se mostrará is_true , o de lo contrario no lo hará.
aquí está mi proyección con $cond
$project: { 'listAnswer.is_true': { $cond: { if: { $eq: ["$$isShowAnswer", false] }, then: "$$REMOVE", else: 1} }, },pero el resultado es como el siguiente
{ "answer_content": " \\[x=-2\\] ", "answer_url_image": "", "answer_url_mp3": "", "answer_id": 136948, "is_true": 1 }, { "answer_content": " \\[x=-1\\] ", "answer_url_image": "", "answer_url_mp3": "", "answer_id": 136950, "is_true": 1 },¿Cómo puedo eliminar el campo "is_true" si la condición es correcta y no hacer nada si es incorrecta?
Para actualizar una matriz, debe usar $map . Eliminar una clave por condición no es simple, puede usar una solución alternativa con $objectToArray y luego revertir nuevamente con $arrayToObject
db.getCollection("collection").aggregate([ { $project: { listAnswer: { $map: { input: "$listAnswer", as: 'answer', in: { $cond: { if: { $eq: ["$$isShowAnswer", false] }, then: { $mergeObjects: ["$$answer", { is_true: 1 }] }, else: { $arrayToObject: { $filter: { input: { $objectToArray: "$$answer" }, as: 'item', cond: { $ne: ["$$item.k", 'is_true'] } } } } } } } } } } ])Otra solución sería
{$unwind: "$listAnswer"}{ $cond: { if: { $eq: ["$$isShowAnswer", false] }, then: "$$REMOVE", else: 1} }$group