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 可能不以 $ 开头的主要内容,如果未能解决你的问题,请参考以下文章