You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

MongoDB geoNear函数报错及查询结果为空问题求助

Troubleshooting the Empty Array Issue with Mongoose $geoNear

Hey there! I’ve run into this exact kind of problem before when working with geospatial queries in MEAN stack apps—let’s walk through the most likely fixes for your empty array result after fixing the original geoNear is not a function error.

1. First: Double-Check Your Geospatial Index

MongoDB won’t return any geospatial results unless you’ve created the right index on your location field. Here’s what you need to confirm:

  • Your Loc schema should define a location field in the GeoJSON Point format (critical for 2dsphere indexes, which are recommended for real-world coordinates):
    const locSchema = new mongoose.Schema({
      // Other fields...
      location: {
        type: { type: String, enum: ['Point'], default: 'Point' },
        coordinates: { type: [Number], required: true }
      }
    });
    
    // Create the 2dsphere index—this is non-negotiable for $geoNear with spherical queries
    locSchema.index({ location: '2dsphere' });
    
  • If you added the index after inserting data, you might need to reindex the collection. Run this in your MongoDB shell:
    db.locs.reIndex()
    

2. Verify Coordinate Order & Distance Units

This is the #1 mistake people make with geospatial queries:

  • MongoDB uses [longitude, latitude] order (not the latitude-first order you might be used to from maps). If you stored your coordinates backwards, your query will look in the wrong part of the globe and return nothing.
  • maxDistance units depend on your index:
    • For 2dsphere indexes (the standard for real locations), units are meters. So if you want to search within 5 kilometers, set maxDistance: 5000, not 5.
    • For old 2d indexes, units are radians—this is rarely used anymore, but worth checking if you’re following an outdated tutorial.

Here’s a corrected $geoNear aggregation example using modern Mongoose:

Loc.aggregate([
  {
    $geoNear: {
      near: { type: 'Point', coordinates: [-73.9857, 40.7484] }, // [lon, lat] for NYC
      distanceField: 'calculatedDistance', // Field to store the distance in results
      maxDistance: 10000, // 10 kilometers = 10,000 meters
      spherical: true // Required when using 2dsphere index
    }
  }
])
.then(results => console.log(results))
.catch(err => console.error('Aggregation error:', err));

3. Confirm Your Collection Has Matching Data

Even if your code is perfect, if there are no documents within your specified distance, you’ll get an empty array. Test this directly in MongoDB Compass or the shell to rule out data issues:

# Shell query to check for documents near your target coordinates
db.locs.find({
  location: {
    $nearSphere: {
      $geometry: { type: 'Point', coordinates: [-73.9857, 40.7484] },
      $maxDistance: 10000
    }
  }
})

If this returns nothing, you either need to adjust your maxDistance or add test data that falls within the range.

4. Check Mongoose/MongoDB Version Compatibility

Older versions of Mongoose might have bugs or deprecated behavior around $geoNear. Run npm list mongoose to check your version—aim for 6.x or 7.x (stable, modern releases). If you’re on a super old version, updating might resolve hidden issues.


内容的提问来源于stack exchange,提问作者Galen Casstevens

火山引擎 最新活动