为何MongoDB的$rank不支持多sortBy字段?能否多字段排名?
MongoDB 多字段排名报错解决
首先明确:完全可以基于多个字段进行文档排名,你遇到的报错并非因为使用了多字段排序,而是语法写法有误。
报错原因
错误提示“$rank must be specified with a top level sortBy expression with exactly one element”的核心问题在于,你的$rank窗口函数写法不符合PHP MongoDB驱动的语法要求,并非多字段排序本身不被支持。
修正后的代码
你可以保留$setWindowFields顶级的多字段sortBy,同时修正$rank的写法:
$resultListing = UserScore::raw(function ($collection){ return $collection->aggregate([ ['$setWindowFields' => [ 'sortBy' => ['score' => -1, 'attempts' => 1], 'output' => [ 'scoreRank' => ['$rank' => []] ], ]] ]); });
如果需要针对$rank单独指定排序(与全局sortBy区分开),也可以在$rank内部定义多字段排序:
$resultListing = UserScore::raw(function ($collection){ return $collection->aggregate([ ['$setWindowFields' => [ 'output' => [ 'scoreRank' => [ '$rank' => [ 'sortBy' => ['score' => -1, 'attempts' => 1] ] ] ], ]] ]); });
验证依据
官方$setWindowFields的语法示例明确支持多字段sortBy,说明多字段排名是MongoDB原生支持的功能,你的报错仅为语法细节问题,而非功能限制。
内容的提问来源于stack exchange,提问作者tyro
相关产品推荐
相关产品推荐

