MongoDB 聚合:FieldPath 不能以 $ 开头

MongoDB aggregation: FieldPath may not start with $

此 MongoDB 聚合失败:

Attendance.aggregate([
            { $match: { cohort_id: cohort_id} },
            { $unwind: "$absences" },
            {
                $group: {
                    _id: {
                        term: "$absences.term",
                        $function:
                            {
                                body: function (day) {
                                    return day.getDay();
                                },
                                args: ["$absences.formatted_date.day"],
                                lang: "js",
                            },
                    },
                    count: { $sum: 1 },
                },
            },
            { $sort: { count: 1 } },
        ])

出现此错误:

uncaught exception: Error: command failed: {
        "ok" : 0,
        "errmsg" : "FieldPath field names may not start with '$'. Consider using $getField or $setField.",
        "code" : 16410,
        "codeName" : "Location16410"
} with original command request: {
        "aggregate" : "attendances",
        "pipeline" : [
                {
                        "$match" : {
                                "cohort_id" : "61858e13dc5e0d1ce0238abd"
                        }
                },
                {
                        "$unwind" : "$absences"
                },
                {
                        "$group" : {
                                "_id" : {
                                        "term" : "$absences.term",
                                        "$function" : {
                                                "body" : function (day) {                                     return day.getDay();                                 },
                                                "args" : [
                                                        "$absences.formatted_date.day"
                                                ],
                                                "lang" : "js"
                                        }
                                },
                                "count" : {
                                        "$sum" : 1
                                }
                        }
                },
                {
                        "$sort" : {
                                "count" : 1
                        }
                }
        ],
        "cursor" : {

        },
        "lsid" : {
                "id" : UUID("b4505aa0-e65e-46cd-8e31-03e4ecdbfe3b")
        }
} 
...

不是最有帮助的错误消息。

我在哪里引用了错误的字段名称?看起来它在某处期待一个没有 $ 的字段名称,但我似乎找不到哪里。

我看过关于此错误的类似帖子,但它们通常与 $project$sort 有关,这似乎不是这里的问题

谢谢!

它将$function视为字段名称。我觉得应该是这样的:

    {
        $group: {
           _id: {
           term: "$absences.term",
           day: {
                $function:  {
                    body: function (day) {
                       return day.getDay();
                    },
                    args: ["$absences.formatted_date.day"],
                    lang: "js",
                },
           },
           count: { $sum: 1 },
       },
    }

这是学校作业吗? day.getDay() 听起来是一个非常简单的函数,在 MongoDB 查询语言中应该是原生的。

找到了一个更简单且有效的解决方案:

Attendance.aggregate([
            { $match: { cohort_id: cohort_id} },
            { $unwind: "$absences" },
            {
                $group: {
                    _id: {
                        term: "$absences.term",
                        day: {
                            $dayOfWeek: "$absences.formatted_date.day"
                       },
                    },
                    count: { $sum: 1 },
                },
            },
            { $sort: { count: 1 } },
        ])