当前位置: 首页 > 知识库问答 >
问题:

Mongoose/MongoDb获取错误geoNear不是函数

晋弘义
2023-03-14

这是我的控制器文件位置。js

var mongoose = require('mongoose');
var Loc = mongoose.model('location');

module.exports.locationsListByDistance = function(req, res) {
  var lng = parseFloat(req.query.lng);
  var lat = parseFloat(req.query.lat);
  var point = {
    type: "Point",
    coordinates: [lng, lat]
  };
  var geoOptions = {
    spherical: true,
    maxDistance: 1000
  };

  Loc.geoNear(point, geoOptions, function (err, results, stats) {
    console.log(results);
  });
};

我的模型文件位置。js

var mongoose = require('mongoose');

var reviewSchema = new mongoose.Schema({
    author: String,
    rating: {
        type: Number,
        required: true,
        min: 0,
        max: 5
    },
    reviewText: String,
    createdOn: {
        type: Date,
        "default": Date.now
    }
});

var openingTimeSchema = new mongoose.Schema({
    days: {
        type: String,
        required: true
    },
    opening: String,
    closing: String,
    closed: {
        type: Boolean,
        required: true
    }
});

var locationSchema = new mongoose.Schema({
    name: {
        type: String,
        required: true
    },
    address: String,
    rating: {
        type: Number,
        "default": 0,
        min: 0,
        max: 5
    },
    facilities: [String],
    // Always store coordinates longitude, latitude order.
    coords: {
        type: [Number],
        index: '2dsphere'
    },
    openingTimes: [openingTimeSchema],
    reviews: [reviewSchema]
});

mongoose.model('location', locationSchema, 'locations');

每当我跑的时候http://localhost:3000/api/locations?lng=-0.9690884

TypeError: Loc.geo在Layer.handle[作为handle_request](/home/shacker/Projects/loc8r/app_api/控制器/locations.js:51: 7)时没有module.exports.locations的函数lib/router/layer.js:95: 5)at Next(/home/shacker/Projects/平均值/loc8r/node_modules/Express/lib/router/route.js:137: 13)at Route.dispatch(/home/shacker/Projects/平均值/loc8r/node_modules/Express/lib/router/route.js:112: 3)在Layer.handle[作为handle_request](/home/shacker/Projects/平均值/loc8r/node_modules/Express/lib/router/layer.js:95: 5) /home/shackers/Projects/mean/loc8r/node_modules/express/lib/router/index.js:281: 22在Function.process_params(/home/shackers/Projects/mean/loc8r/node_modules/express/lib/router/index.js:335: 12)在下一个(/home/shacker/Projects/均值/loc8r/node_modules/Express/lib/路由器/index.js:275: 10)在Function.handle(/home/shacker/Projects/均值/loc8r/node_modules/Express/lib/路由器/index.js:174: 3)在路由器(/home/shacker/Projects/均值/loc8r/node_modules/Express/lib/router/index.js:47: 12)在Layer.handle[handle_request](/home/shacker/Projects/均值/loc8r/node_modules/Express/lib/router/layer.js:95: 5)在trim_prefix(/home/shacker/Projects/平均值/loc8r/node_modules/Express/lib/router/index.js:317: 13) /home/shackers/Projects/mean/loc8r/node_modules/express/lib/router/index.js: 284:7在函数。process_params(/home/shacker/Projects/平均值/loc8r/node_modules/Express/lib/router/index. js: 335:12)在下一个(/home/shacker/Projects/平均值/loc8r/node_modules/Express/lib/router/index. js: 275:10)在 /home/shackers/Projects/mean/loc8r/node_modules/express/lib/router/index.js: 635:15

这是我正在使用的依赖项的版本:

  • 节点: 8.9.3 npm: 5.5.1快速: 4.15.5猫鼬: 5.0.0 mongoDb: 3.6.1

共有3个答案

鄂育
2023-03-14

我有完全相同的问题,我已经放弃了我以前使用的方法(看起来你也有)。以下是一个不会抛出错误的替代方案,应该会给您使用Loc.geo附近后的相同结果:

Loc.aggregate(
        [
            {
                '$geoNear': {
                    'near': point,
                    'spherical': true,
                    'distanceField': 'dist',
                    'maxDistance': 1000
                }
            }
        ],
        function(err, results) {
            // do what you want with the results here
        }
    )
荆梓
2023-03-14

发生此错误的原因是以前支持. Geo近东,但从使用Node MongoDB v3驱动程序的Mongoose 5开始不再支持。

该问题记录在迁移到Mongoose 5文档中,该文档又链接到MongoDB 3驱动器发行说明,该说明提供了关于推荐更换的以下声明

geoNear命令的功能在语言中的其他地方重复,在未分块集合上的$near/$nearSphere查询运算符中重复,在所有集合上的$geoNear聚合阶段中重复。

实际上,官方文件认可了其他答案中记录的$geoNear的使用。

解飞语
2023-03-14
router.get('/', () => {
    Loc.aggregate([
        {
            $geoNear: {
                near: 'Point',
                distanceField: "dist.calculated",
                maxDistance: 100000,
                spherical: true                
            }
        }
    ]).then(function(err, results, next){
        res.send();
    }).catch(next);
});

参考:-https://docs.mongodb.com/manual/reference/command/geoNear/

 类似资料:
  • 我有一个迷你赌场游戏和猫鼬模型定义如下: 在本地运行我的应用程序时,我没有遇到任何错误。但是,在ubuntu生产环境中运行时,我得到以下错误: 堆栈跟踪显示错误来自db_utils.js,如下所示: 我检查了我的module.exports的定义是否正确,它是正确的。不确定为什么会发生这个错误。 我的本地和生产节点版本匹配。12.18.4

  • 问题内容: 我正在尝试使用nodejs和socket.io 连接到我的 mongodb 。我能够连接到数据库,因为一旦我-确实- 获得了我在控制台中但在Node.js端上的“连接接受” 通过猫鼬建立与mongodb:// localhost:27017的连接 接下来它立即失败 process.nextTick(function(){throw err;})^ TypeError:undefined

  • 我在MongoDB中有一些地理空间数据,我想找到靠近用户位置并符合某些标准的地方列表。 下面是我的文档结构: 现在我正试图通过纬度,经度,找到有票可用的,并且是某种类型的地方。当我只使用带坐标的NearQuery(不添加查询)时,我得到的是结果,但当我添加查询对象时,我得到的是空列表。 提前致谢

  • 我试图从与参数值相连的子域列表中执行,但得到一个错误。我不确定循环是否正常工作,第一次尝试只是不是一个有效的子域+域。或者它根本不起作用? 误差 代码 新def子校验码 新产出

  • 我正在尝试向所有灯箱添加图像。但是我得到的错误是$不是一个函数。 以下是我正在使用的代码: 谢谢你。

  • 我得到了一个错误:这个$情态动词模态不是一个函数 我通过gulp文件从wwwroot文件夹中的Node_模块获得了ng2-bs3-modal。 我的文件夹结构是: 如果我将ng2-bs3-modal移动到脚本(typescript)文件夹,它将提供jasmin区域。js错误。在上面的结构中,我得到了“this.$modal.modal不是函数”错误,因为ng2-bs3-modal中的所有类型脚本都