#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,
},
},