Mongoose中$match+$geoNear配合$facet做聚合查询报错如何解决?
问题原因与解决方案
报错直接原因
你当前的聚合管道写法不符合MongoDB语法规范:
- 聚合管道的每个阶段必须是独立的单操作符对象,你将
$match和$geoNear两个聚合操作符放在了同一个对象里,导致MongoDB无法识别为合法的管道操作符,触发报错。
额外需要修正的语法问题
除了管道结构错误,还有几个$geoNear的使用规则需要遵守:
$geoNear要求必须是聚合管道的第一个阶段,不能将$match放在它前面,原本的过滤条件可以移入$geoNear的query参数中实现前置过滤$geoNear有必填参数distanceField,用于指定返回结果中存储两点距离的字段名- 坐标参数
coordinates要求传入数值类型,你当前传入的是字符串格式的经纬度,需要转换为数字
修正后的代码
this.usersModel.aggregate([ { $geoNear: { near: { type: 'Point', coordinates: [43.48, 5.34] }, // 坐标转为数字类型 key: 'addresses', distanceField: 'calculatedDistance', // 新增必填的距离存储字段 query: { // 原$match的过滤条件移到此处实现前置过滤 practices: 'practice1', status: 'new' } } }, { $facet: { metadata: [ { $group: { _id: null, total: { $sum: 1 } } } ], data: [{ $sort: sort }, { $skip: skip }, { $limit: limit }] } } ])
内容的提问来源于stack exchange,提问作者barden
相关产品推荐
相关产品推荐

