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

Mongodb 在聚合管道中使用文档字段作为JS对象字段名,mongodb,mongodb-query,aggregation-framework,Mongodb,Mongodb Query,Aggregation Framework,我有一个名为TaskScontMap的JS对象: 我需要获得聚合管道中每个用户类型的任务计数,“Freshman”、“Senior”是名为gradeLevel的文档字段。我试着这样做: status: { $let: { vars: { tasksCount: tasksCountMap['$gradeLevel'], completedTasksCount: '$completedTasksCount[0].c

我有一个名为TaskScontMap的JS对象:

我需要获得聚合管道中每个用户类型的任务计数,“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'
            }
          }
        }
      }
另外,“$CompletedTaskScont[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,
  }

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

我将$projectstage一分为二,并自由地清理了状态计算

差不多

{"$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"
        }
      }
    }
  }
}}

你能给这篇文章添加一份样本文档吗?什么是“$CompletedTaskScont[0]。计数?我添加了完整的管道。TaskScont变量包含有效值,谢谢,但CompletedTaskScont为null…在项目阶段也为null。。。如果我删除查找下面的所有阶段,我会在results CompletedTaskScont:[{count:27}]中获得一个有效值,但如果我只是添加项目阶段:{$project:{completedTask:$CompletedTaskScont}},我会得到CompletedTaskScont:[],并且结果中没有completedTask。。。你知道为什么吗?谢谢你的帮助。你使用什么框架?看起来值没有从$lookup传递到下一个阶段。您能在shell中尝试查询并验证吗?我为此问题创建了新问题
{"$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"
        }
      }
    }
  }
}}