无法规范化查询 :: 由地理附近查询中的 :: 无效参数引起
Posted
技术标签:
【中文标题】无法规范化查询 :: 由地理附近查询中的 :: 无效参数引起【英文标题】:Can't canonicalize query :: caused by :: invalid argument in geo near query 【发布时间】:2021-06-07 16:42:47 【问题描述】:希望有人可以帮助解决这个问题,因为我整个上午都在努力
我正在尝试使用 MongoDB Near 来查找地图上给定点半径内的位置。我收到以下错误:
"name":"MongoError","message":"Can't canonicalize query :: 由 :: 地理附近查询中的无效参数:球形","$err":"不能 规范化查询 :: 由地理附近查询中的 :: 无效参数引起: 球形","code":2,"ok":0
这是位置的猫鼬模式:
var mongoose = require('mongoose'),
Schema = mongoose.Schema;
var LocationSchema = new Schema(
title: String,
coordinates:
type: [Number],
index: '2dsphere'
,
created:
type: Date,
default: Date.now
);
mongoose.model('Location', LocationSchema);
这是我尝试使用“Near”的路线 - 基本上我以目标如下的形式输入一组坐标
router.post('/nearme', function (req, res, next)
// Setup limit
var limit = req.body.limit || 10;
// Default max distance to 10 kilometers
var maxDistance = req.body.distance || 10;
// Setup coords Object = [ <longitude> , <latitude> ]
var coords = [];
// Create the array
coords[0] = req.body.longitude;
coords[1] = req.body.latitude;
// find a location
Location.find(
'coordinates':
$near:
$geometry:
type: "Point",
coordinates: coords
,
// distance to radians
$maxDistance: maxDistance * 1609.34, spherical: true
).limit(limit).exec(function (err, stores)
if (err)
return res.status(500).json(err);
//res.status(200).json(stores);
res.render('locations',
title: 'Locations',
location: stores,
lat: -23.54312,
long: -46.642748
);
);
另外 - 我按如下方式对位置集合进行了索引:
db.locations.ensureIndex( 'coordinates' : '2dsphere')
据我所知,它看起来不错:
我尝试过的事情:
-
使用“geoNear”而不是几何。
删除
spherical:true
在 *** 中搜索类似的错误 - 似乎没有相同的问题
您能提供的任何帮助都会令人惊叹。谢谢!
【问题讨论】:
$near 和 $geoNear 不一样。 $near 没有名为球面的选项 @Joe 谢谢。这实际上是来自于 2016 年出版的一本书的代码,所以从那时起 mongo 发生了变化,或者书中有错误。在看到您的评论并查看文档后,我正在用我想出的解决方案来回答我自己的问题。再次感谢。 【参考方案1】:感谢 Joe,我查看了 MongoDB 文档并更新了 /nearme 路由,如下所示(在 $near 中所做的更改):
router.post('/nearme', function (req, res, next)
// Setup limit
var limit = req.body.limit || 10;
// Default max distance to 10 kilometers
var maxDistance = req.body.distance || 10;
// Setup coords Object = [ <longitude> , <latitude> ]
var coords = [];
// Create the array
coords[0] = req.body.longitude;
coords[1] = req.body.latitude;
// find a location
Location.find(
'coordinates':
$near:
$geometry:
type: "Point" ,
coordinates: coords
,
$maxDistance: maxDistance * 1609.34,
$minDistance: 0
).limit(limit).exec(function (err, stores)
if (err)
return res.status(500).json(err);
//res.status(200).json(stores);
res.render('locations',
title: 'Locations',
location: stores,
lat: -23.54312,
long: -46.642748
);
);
);
【讨论】:
以上是关于无法规范化查询 :: 由地理附近查询中的 :: 无效参数引起的主要内容,如果未能解决你的问题,请参考以下文章