MongoDB:如何在geoNear中传入变量字段?坐标数组使用问题
问题
客户端获取到用户坐标数组[31.4998, -61.4065],通过URL参数传递给API接口;在API中用const userLocArray = userLoc.split(',');将参数转为数组,但直接把userLocArray[0], userLocArray[1]放到MongoDB的$geoNear的coordinates里无效,请问该如何正确处理?
相关代码如下:
客户端代码
const userLoc = currentUser.location.coordinates; console.log(userLoc)// 输出 [31.4998, -61.4065] let { data: matches } = useSWR(`/api/myapi?userIdToMatch=${_id}&userLoc=${userLoc}&page=${matchIndex}`, fetcher);
API代码
handler.get(async (req, res) => { const {userIdToMatch, userLoc} = req.query; const userLocArray = userLoc.split(',');
$geoNear操作代码
$geoNear: { near: { type: "Point", coordinates: [userLocArray[0], userLocArray[1]] }, distanceField: "calculatedDist", spherical: true }
解决方案
问题核心原因有两个:
- URL参数传递时,数组会被自动转为逗号分隔的字符串,
split(',')得到的是字符串类型的坐标元素,但MongoDB的$geoNear要求坐标必须是数值类型。 - MongoDB地理坐标遵循
[经度, 纬度]的格式,需确认你的原始坐标顺序是否匹配。
具体修正步骤:
1. 转换坐标元素为数值类型
在API中对分割后的字符串数组做类型转换:
handler.get(async (req, res) => { const {userIdToMatch, userLoc} = req.query; // 分割后将每个元素转为数值 const userLocArray = userLoc.split(',').map(coord => parseFloat(coord));
2. 确认坐标顺序并应用到$geoNear
- 如果原始坐标是
[纬度, 经度],需要调换顺序后传入:
$geoNear: { near: { type: "Point", coordinates: [userLocArray[1], userLocArray[0]] }, distanceField: "calculatedDist", spherical: true }
- 如果原始坐标已经是
[经度, 纬度],直接传入转换后的数值数组即可:
$geoNear: { near: { type: "Point", coordinates: userLocArray }, distanceField: "calculatedDist", spherical: true }
3. 可选:优化客户端参数传递
在客户端主动将数组转为逗号分隔的字符串,避免潜在的格式异常:
const userLocStr = currentUser.location.coordinates.join(','); let { data: matches } = useSWR(`/api/myapi?userIdToMatch=${_id}&userLoc=${userLocStr}&page=${matchIndex}`, fetcher);
内容的提问来源于stack exchange,提问作者Kal
相关产品推荐
相关产品推荐

