无法规范化查询 :: 由地理附近查询中的 :: 无效参数引起

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
    );
);

);

【讨论】:

以上是关于无法规范化查询 :: 由地理附近查询中的 :: 无效参数引起的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 Firestore 运行地理“附近”查询?

将经度和纬度数据存储在数据库中,并查询附近的记录

Spring-data MongoDB地理查询

盒子地理空间查询中的猫鼬无法正常工作

优化地理搜索查询

为啥mongodb返回地理索引错误?