MongoDB 聚合:FieldPath 可能不以 $ 开头

Posted

技术标签:

【中文标题】MongoDB 聚合:FieldPath 可能不以 $ 开头【英文标题】:MongoDB aggregation: FieldPath may not start with $ 【发布时间】:2021-12-20 08:52:11 【问题描述】:

此 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 有关,这似乎不是这里的问题

谢谢!

【问题讨论】:

【参考方案1】:

它将$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 查询语言中使用。

【讨论】:

您好!感谢您的回答。使用此解决方案,MongoDB Shell 不再抛出相同的错误,这很好,但是在我的 JS 代码(Mongoose)中使用此聚合,我仍然会收到内部服务器错误,并且找不到问题。无法在 mongodb shell 中对其进行测试,因为它无法识别 JS 代码(当然)。如果我能找到一种仅使用 Mongo 运算符来度过一天的方法,那就太棒了——有什么建议吗? 澄清一下,我在这里使用getDay() 来获取与 Date 对象对应的星期几。 我找到了解决办法!我会在下面发布它。谢谢你的帮助!!【参考方案2】:

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

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  ,
        ])

【讨论】:

以上是关于MongoDB 聚合:FieldPath 可能不以 $ 开头的主要内容,如果未能解决你的问题,请参考以下文章

在聚合框架mongodb中找到从一个机场到另一个机场的可能航班,最多有一个中间机场停机

如何使用 MongoDB 聚合对唯一 ID 求和?

我想知道高级mongodb聚合

mongodb - 没有本地的聚合查找

Mongodb聚合管道如何限制组推送

在 MongoDB 聚合框架中计算中位数