MongoDB聚合投影阶段如何结合$filter与$sortArray?
问题解决:MongoDB聚合投影阶段的过滤与排序错误
错误原因
出现的FieldPath field names may not start with '$'错误,根源是在$project阶段的queue字段中,直接并列了$filter和$sortArray两个顶级操作符。MongoDB要求字段的投影值必须是单个表达式,这种平级放置多个操作符的写法会让数据库把$sortArray误判为以$开头的非法字段名。
另外,管道后续的$group和$unwind步骤存在路径不匹配问题:$group将结果存入items字段,但$unwind却指定了$queue路径,这会导致执行失败。
修正后的聚合管道
以下是调整后的代码,实现先过滤queue数组,再对过滤结果排序,同时移除冗余步骤:
[ { '$match': { '_id': ObjectId('659dfebd24358fa4604510bb') } }, { '$project': { 'date': 1, 'serviceScheduleId': 1, 'serviceId': 1, 'branchOfficeId': 1, 'companyId': 1, 'queue': { '$sortArray': { // 先执行$filter过滤数组,再将结果传入$sortArray排序 'input': { '$filter': { 'input': '$queue', 'cond': { '$and': [ {'$eq': ['$$this.queueType', 'online']}, {'$eq': ['$$this.checkinTime', null]}, // MongoDB中空值用null而非None {'$eq': ['$$this.user.status', 'incall']} ] } } }, 'sortBy': {'user.ticketInt': -1} } } } } ]
关键修正说明
- 嵌套操作符:把
$filter作为$sortArray的input值,确保先完成数组过滤,再对过滤后的结果排序,符合MongoDB表达式语法规范。 - 修正空值写法:MongoDB语法中,空值需用
null,而非Python风格的None。 - 移除无效步骤:原管道中的
$group和$unwind属于冗余操作(若需求仅为处理queue数组并保留原文档结构);若确实需要分组展开,需将$unwind的路径调整为$items并重新规划逻辑。
内容的提问来源于stack exchange,提问作者baniadam
相关产品推荐
相关产品推荐

