mongodb — использование $ geoNear дает «geo near принимает только один аргумент при запросе точки GeoJSON» при использовании maxDistance

#node.js #mongodb #mongoose #geojson #geonear

#node.js #mongodb #mongoose #geojson #geonear

Вопрос:

Похоже, это распространенная ошибка, но я не могу заставить ее работать со всеми предложениями, которые я видел. Это моя настройка:

 // point.js (based on mongoose recommended subdocument pattern for reusing the GeoJSON definition
// see here https://mongoosejs.com/docs/geojson.html)
const mongoose = require('mongoose');

const pointSchema = new mongoose.Schema({
    type: {
        type: String,
        enum: ['Point'],
        required: true
    },
    coordinates: {
        type: [Number],
        required: true,
    }
});

exports = pointSchema;
 
 // user.js
var schema = new Schema({
  location: {
    type: pointSchema,
  },
  ...
});

schema.index({ location: '2dsphere' });
var User = mongoose.model('User', schema);
 
 // routeHandler.js
          const near = { type: 'Point', coordinates: [lng, lat] };
          User.aggregate([
            { $geoNear: {
              near,
              distanceField: 'dist',
              maxDistance: 100000,
              spherical: true,
            } },
            ...
          ]).exec((err, results) => {
            console.log('error or results:', err, results);
          });
 

И я получаю эту ошибку:

MongoError: не удалось определить, может ли система запросов предоставить закрытую проекцию :: вызвано :: geo near принимает только один аргумент при запросе точки GeoJSON. Найдено дополнительное поле: $maxDistance: 100000.0

Большинство потоков, которые я видел, предполагают, что это проблема с индексацией, но вы можете видеть, user.js что я напрямую вызываю

 schema.index({ location: '2dsphere' });
 

без какой-либо удачи.

Я был бы очень признателен за любые предложения, спасибо!

Ответ №1:

У меня была такая же проблема, и я прошел через множество решений, но ни одно из них не сработало, поскольку реальная проблема заключалась в данных.

В моей модели был индекс 2dsphere, который был правильным, но при использовании 2dshpere местоположение в базе данных должно быть в формате location: [ lng, lat ], что было основной проблемой.поскольку mongodb не проверяет массив местоположений в этом формате.

Убедитесь, что как данные в БД, так и точки, указанные при запросе, должны иметь правильный формат.

Надеюсь, это кому-то поможет!

Комментарии:

1. Да, это правда. В моем случае проблема заключалась в том, что я указал координаты в виде строк вместо чисел.

Ответ №2:

Я также столкнулся с той же ошибкой, и после долгих исследований я нашел то, что запускает запрос агрегации. Я передавал координаты в виде массива строк, который должен быть массивом чисел.

 {
        $geoNear: {
          near: {
            type: "Point",
            coordinates: [103.83797, 1.46103],
          },
          distanceField: "dist.calculated",
          maxDistance: distance,
          includeLocs: "dist.location",
          spherical: true,
        },
      },