首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >带有三个$addfield mongodb的$cond

带有三个$addfield mongodb的$cond
EN

Stack Overflow用户
提问于 2022-04-02 23:12:17
回答 1查看 54关注 0票数 0

我有来自聚合$lookup的输出数据

代码语言:javascript
复制
     [
      {
        _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,这些数据只有几个条件,如果是其他条件的话。我将给出一个示例addfield条件,大致类似于这个条件:

如果(question_answered.question.type_question ==‘随笔’而没有分数在每一篇文章类型的问题中都为空),那么formated_status_evaluation_essay =“完全评分”。 然后,formated_status_evaluation_essay =“不完全评分” 如果没有文章类型的问题,那么,formated_status_evaluation_essay =“无问题”

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

代码语言:javascript
复制
    [
      {
        _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_pg不包含任何问题,因为question_answer.question.type_question中没有essay_pg类型。

我尝试过这样做,但仍然像前面解释的那样混淆了编码三种条件。我将这样的代码放在$lookup聚合的末尾。

代码语言:javascript
复制
    { 
        '$addFields': { 
          'formated_status_evaluation_essay': { 
               '$cond': [ 
                   {
                    '$and': [ 
                      {'$$question_answer.question.type_soal ': 
                      'essay'},
                      {'$$question_answer.nilai':{$ne:null}},
                      ]    
                    },
                   'already scoring', 
                   'havent scoring' 
               ] 
            } 
        } 
    }  

我几乎如愿以偿,但似乎仍然有一个错误的语法,我写的。如果你们能帮我我会很感激的。已经工作了两天了,还是没有得到答复。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-04-02 23:53:51

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

代码语言:javascript
复制
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"
        }
      }
    }
  }
])

这是供您参考的蒙戈游乐场

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/71721815

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档