首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在聚合管道中的项目阶段排除嵌套对象属性有困难

在聚合管道中的项目阶段排除嵌套对象属性有困难
EN

Stack Overflow用户
提问于 2021-11-05 04:37:47
回答 1查看 78关注 0票数 0

我有一个聚合查询,它根据文档的类型返回具有不同架构的问题数组。这些文件的格式如下。有些问题可能是这样的

代码语言:javascript
复制
{
   "_id": "ID01",
   "Description": "1.Any Question?",
   "answer": { "option05": "E. " },
   "options": {
               "option01": "A.",
               "option02": "B.",
               "option03": "C.",
               "option04": "D.",
               "option05": "E."
              },
   "type": "1",
   "score": 10
},

有些问题有如下的结构

代码语言:javascript
复制
{
  "_id": "ID02",
  "Description": "Question Description.",
  "emq": {
           "emq3": {
                     "answer": "option12",
                     "explanation": "",
                     "question": "1 Any Qstn?"
                   },
           "emq4": {
                     "answer": "option03",
                     "explanation": "",
                     "question": "2 Any Qstn?"
                   },
           "emq5": {
                     "answer": "option06",
                     "explanation": "",
                     "question": "3 Any Qstn?"
                    }
            },
                               
  "options": {
               "option01": "",
               "option02": "",
               "option03": "",
               "option04": "",
             },
  "type": "2",
  "score": 100
},

我使用了以下聚合管道来隐藏问题中的答案(所讨论的模式已被迁移,并且无法更改其结构)

聚集管线

代码语言:javascript
复制
{
          $lookup: {
            from: 'questions',
            let: {
              question_id: { $toObjectId: '$qId' },
              score: '$score',
            },
            pipeline: [
              {
                $match: {
                  $expr: {
                    $eq: ['$_id', '$$question_id'],
                  },
                },
              },
              {
                $project: {
                  answer: {
                    $cond: {
                      if: { $eq: ['$type', '1'] },
                      then: 0,
                      else: {
                        $cond: {
                          if: { $eq: ['$type', '3'] },
                          then: {
                            $cond: {
                              if: {
                                emq: {
                                  regex: /^emq\d+$/,
                                },
                              },
                              then: 0,
                              else: 1,
                            },
                          },
                          else: 1,
                        },
                      },
                    },
                  },
                  Description: 1,
                  options: 1,
                  type: 1,
                  emq: 1,
                  score: 1,
                },
              },
          }

它适用于类型1的问题,但不幸的是,我无法隐藏类型2的答案,因为它们不仅在'emq‘对象中,而且在嵌套的' emq3’对象中,在字符串'emq‘的末尾有动态数字,我应用了regex,但不知怎么的,我无法在emq3对象中预测答案,是否存在这样的结果来隐藏两个问题的答案:

代码语言:javascript
复制
{
   "_id": "ID01",
   "Description": "1.Any Question?",
   "options": {
               "option01": "A.",
               "option02": "B.",
               "option03": "C.",
               "option04": "D.",
               "option05": "E."
              },
   "type": "1",
   "score": 10
},
{
      "_id": "ID02",
      "Description": "Question Description.",
      "emq": {
               "emq3": {
                         "question": "1 Any Qstn?"
                       },
               "emq4": {
                         "question": "2 Any Qstn?"
                       },
               "emq5": {
                         "question": "3 Any Qstn?"
                        }
                },
                                   
      "options": {
                   "option01": "",
                   "option02": "",
                   "option03": "",
                   "option04": "",
                 },
      "type": "2",
      "score": 100
    },
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-11-05 05:25:19

您可以在聚合管道中执行以下操作:

  1. 使用emq将对象$objectToArray转换为k-v元组数组。
  2. $project以移除字段answerexplanation
  3. convert the array emq`‘回到对象
代码语言:javascript
复制
db.collection.aggregate([
  {
    "$addFields": {
      "emq": {
        "$objectToArray": "$emq"
      }
    }
  },
  {
    "$project": {
      "emq.v.answer": false,
      "emq.v.explanation": false,
      "answer": false
    }
  },
  {
    "$addFields": {
      "emq": {
        "$arrayToObject": "$emq"
      }
    }
  },
  {
    "$addFields": {
      emq: {
        "$cond": {
          "if": {
            $eq: [
              "$emq",
              null
            ]
          },
          "then": "$$REMOVE",
          "else": "$emq"
        }
      }
    }
  }
])

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

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

https://stackoverflow.com/questions/69848736

复制
相关文章

相似问题

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