$addfield 和三个 $cond mongodb

$addfield with three $cond mongodb

我有来自聚合$lookup

的输出数据
     [
      {
        _id: 1,
        name: "Abraham",
        class: "V",
        question_answered: [
          {
            id: "quest1",
            answer: "A",
            score: 10,
            question: {
              soal: "apa judul lagu?",
              correct_answer: "A",
              type_question: "Essay"
            }
          },
          {
            id: "quest2",
            answer: "C",
            score: null,
            question: {
              soal: "apa judul lagu B?",
              correct_answer: "B",
              type_question: "Essay"
            }
          },
          {
            id: "quest3",
            answer: "C",
            score: 10,
            question: {
              soal: "apa judul lagu C?",
              correct_answer: "C",
              type_question: "essay_pg"
            }
          },
          
        ]
      },
      {
        _id: 2,
        name: "Brenda",
        class: "V",
        question_answered: [
          {
            id: "quest1",
            answer: "A",
            score: 10,
            question: {
              soal: "apa judul lagu A?",
              correct_answer: "A",
              type_question: "Essay"
            }
          },
          {
            id: "quest2",
            answer: "C",
            score: 0,
            question: {
              soal: "apa judul lagu B?",
              correct_answer: "B",
              type_question: "Essay"
            }
          }
        ]
      }
    ]

我需要在每个数据中添加额外的字段 formated_status_evaluation_essayformated_status_evaluation_essay_pg,如果有一些条件,elseif,else。我将给出一个示例 addfield 条件,或多或少像这样:

IF(question_answered.question.type_question == 'Essay' and no score is null in every essay type question) then, formated_status_evaluation_essay = "complete scoring".

ELSEIF(there's essay type question and have at least one null score) then, formated_status_evaluation_essay = "Incomplete scoring"

ELSEIF(if theres no essay type question) then, formated_status_evaluation_essay = "no question"

formated_status_evaluation_essay_pg 也是如此。我期望的输出是这样的。

    [
      {
        _id: 1,
        name: "Abraham",
        class: "V",
        question_answered: [....],
        formated_status_evaluation_essay: incomplete scoring,
        formated_status_evaluation_essay_pg: complete scoring,
    
      },
      {
        _id: 2,
        name: "Brenda",
        class: "V",
        question_answered: [....],
        formated_status_evaluation_essay: complete scoring,
        formated_status_evaluation_essay_pg: no question,
      }
    ]

关于输出的解释。 _id:1,得到 evaluation_essay 不完整,因为它有一个包含空分数的对象。但是 evaluation_essay_pg 包含完整的 打分是因为 essay_pg 键入所有内容都有一个分数。

_id:2, evaluation_essay 是完整的,因为所有类型为 essay 的问题都有分数。但是 essay_pg 没有问题,因为 essay_pg 在 question_answer.question.type_question.

中没有输入

我已经试过了,但仍然无法像我之前解释的那样对三个条件进行编码。我把这样的代码放在 $lookup 聚合的末尾。

    { 
        '$addFields': { 
          'formated_status_evaluation_essay': { 
               '$cond': [ 
                   {
                    '$and': [ 
                      {'$$question_answer.question.type_soal ': 
                      'essay'},
                      {'$$question_answer.nilai':{$ne:null}},
                      ]    
                    },
                   'already scoring', 
                   'havent scoring' 
               ] 
            } 
        } 
    }  

我几乎达到了我的预期,但是我写的语法似乎仍然有误。如果你们能帮助我,我将非常感激。忙了两天还是没有回音

尝试使用 $switch 来处理分支,使代码更具可读性。

db.collection.aggregate([
  {
    "$addFields": {
      "formated_status_evaluation_essay": {
        "$filter": {
          "input": "$question_answered",
          "as": "q",
          "cond": {
            $eq: [
              "$$q.question.type_question",
              "Essay"
            ]
          }
        }
      },
      "formated_status_evaluation_essay_pg": {
        "$filter": {
          "input": "$question_answered",
          "as": "q",
          "cond": {
            $eq: [
              "$$q.question.type_question",
              "essay_pg"
            ]
          }
        }
      }
    }
  },
  {
    "$addFields": {
      "formated_status_evaluation_essay": {
        "$switch": {
          "branches": [
            {
              "case": {
                $and: [
                  {
                    "$allElementsTrue": [
                      {
                        "$map": {
                          "input": "$formated_status_evaluation_essay.score",
                          "as": "s",
                          "in": {
                            $ne: [
                              "$$s",
                              null
                            ]
                          }
                        }
                      }
                    ]
                  },
                  {
                    $ne: [
                      {
                        $size: "$formated_status_evaluation_essay"
                      },
                      0
                    ]
                  }
                ]
              },
              "then": "complete scoring"
            },
            {
              "case": {
                "$anyElementTrue": [
                  {
                    "$map": {
                      "input": "$formated_status_evaluation_essay.score",
                      "as": "s",
                      "in": {
                        $eq: [
                          "$$s",
                          null
                        ]
                      }
                    }
                  }
                ]
              },
              "then": "incomplete scoring"
            }
          ],
          default: "no question"
        }
      },
      "formated_status_evaluation_essay_pg": {
        "$switch": {
          "branches": [
            {
              "case": {
                $and: [
                  {
                    "$allElementsTrue": [
                      {
                        "$map": {
                          "input": "$formated_status_evaluation_essay_pg.score",
                          "as": "s",
                          "in": {
                            $ne: [
                              "$$s",
                              null
                            ]
                          }
                        }
                      }
                    ]
                  },
                  {
                    $ne: [
                      {
                        $size: "$formated_status_evaluation_essay_pg"
                      },
                      0
                    ]
                  }
                ]
              },
              "then": "complete scoring"
            },
            {
              "case": {
                "$anyElementTrue": [
                  {
                    "$map": {
                      "input": "$formated_status_evaluation_essay_pg.score",
                      "as": "s",
                      "in": {
                        $eq: [
                          "$$s",
                          null
                        ]
                      }
                    }
                  }
                ]
              },
              "then": "incomplete scoring"
            }
          ],
          default: "no question"
        }
      }
    }
  }
])

这里是Mongo playground供您参考。