代码之家  ›  专栏  ›  技术社区  ›  izmaylovdev

在聚合管道中使用文档字段作为JS对象字段名

  •  0
  • izmaylovdev  · 技术社区  · 7 年前

    tasksCountMap

    const tasksCountMap = {
       'Freshman': 46,
       'Senior': 10
    }
    

    我需要获得聚合管道中每个用户类型的任务计数,'Freshman','Senior'它的文档字段名为 gradeLevel . 我试着这样做:

    status: {
            $let: {
              vars: {
                tasksCount: tasksCountMap['$gradeLevel'],
                completedTasksCount: '$completedTasksCount[0].count'
              },
              in: {
                $cond: {
                  if: { $or: [
                    { $eq: ['$$tasksCount', '$$completedTasksCount'] },
                    { $lte: ['$$tasksCount', '$$completedTasksCount'] },
                  ]},
                  then: 'On track',
                  else: 'High priority'
                }
              }
            }
          }
    

    阿尔索 '$completedTasksCount[0].count' 不适合。。。

    有人能指出正确的方法吗?

    所有管道:

    {
        $match: {
          type: 'student',
          counselorUserName: username
        },
        $project: {
          username: '$username',
          email: '$email',
          phone: '$phone',
          fullName: '$fullName',
          gradeLevel: {
            $switch: {
              branches: [{
                  case: {
                    $eq: ['$gradeLevel', '9']
                  },
                  then: 'Freshman'
                },
                {
                  case: {
                    $eq: ['$gradeLevel', '10']
                  },
                  then: 'Sophomore'
                },
                {
                  case: {
                    $eq: ['$gradeLevel', '11']
                  },
                  then: 'Junior'
                },
                {
                  case: {
                    $eq: ['$gradeLevel', '12']
                  },
                  then: 'Senior'
                }
              ],
              default: "Freshman"
            }
          }
        },
        $lookup: {
          from: 'RoadmapTasksCompleted',
          let: {
            username: '$username',
            gradeLevel: '$gradeLevel'
          },
          pipeline: [{
              $match: {
                monthToComplete: {
                  $in: prevMonthsNames
                },
                $expr: {
                  $and: [{
                      $eq: ['$username', '$$username']
                    },
                    {
                      $eq: ['$gradeLevel', '$$gradeLevel']
                    }
                  ]
                }
              }
            },
            {
              $count: 'count'
            }
          ],
          as: 'completedTasksCount'
        },
        $project: {
          username: '$username',
          email: '$email',
          phone: '$phone',
          fullName: '$fullName',
          completedTask: { $arrayElemAt: ['$completedTasksCount', 0] },
          status: {
            $let: {
              vars: {
                tasksCount: tasksCountMap['$gradeLevel'],
                completedTasksCount: '$completedTasksCount[0].count'
              },
              in: {
                $cond: {
                  if: { $or: [
                    { $eq: ['$$tasksCount', '$$completedTasksCount'] },
                    { $lte: ['$$tasksCount', '$$completedTasksCount'] },
                  ]},
                  then: '$$tasksCount',
                  else:'$$tasksCount'
                }
              }
            }
          }
        }
        $limit: 10,
        $skip: 10,
      }
    
    1 回复  |  直到 7 年前
        1
  •  1
  •   s7vr    7 年前

    您必须将js映射移动到聚合管道中才能访问该映射。

    我分手了 $project

    有点像

    {"$project":{
      "username":"$username",
      "email":"$email",
      "phone":"$phone",
      "fullName":"$fullName",
      "completedTask":{"$arrayElemAt":["$completedTasksCount",0]},
      "tasksCountMap":[{"k":"Freshman","v":46},{"k":"Senior","v":10}]
    }},
    {"$addFields":{
      "status":{
        "$let":{
          "vars":{
            "tasksCount":{
              "$arrayElemAt":[
                "$tasksCountMap.v",
                {"$indexOfArray":["$tasksCountMap.k","$gradeLevel"]}
               ]
             },
            "completedTasksCount":"$completedTask.count"
          },
          "in":{
            "$cond":{
              "if":{"$lte":["$$tasksCount","$$completedTasksCount"]},
              "then":"$$tasksCount",
              "else":"$$completedTasksCount"
            }
          }
        }
      }
    }}