Мангуст захватывает документ на определенном расстоянии от координаты широты-долготы

Я пытаюсь загрузить документ в Mongoose, если он находится, скажем, в 10 километрах от текущей координаты широты/долготы.

Итак, скажем, у меня есть этот объект:

{
    lat: -33.9493992,
    lon: 151.1114885
}

И в моей базе данных Mongoose у меня есть коллекция, и каждый документ в этой коллекции также имеет ключи сохранения lat-lon. Как я могу получить записи только на определенном расстоянии от заданной координаты?

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

Буду признателен за любую помощь.

EDIT: Мой код:

Инициализация модели:

var schema = new mongoose.Schema({
title: String,
    title: String,
    coordinates: {
        type: [ Number ],
        default: [0, 0],
        index: '2dsphere'
    }
});

global.models.Point = mongoose.model('Point', schema);

И код, пытающийся найти в модели: router.route('/points/:lat/:lon') .get(function (req, res) { console.log('lat: ' + req.params.lat + ' lon:' + req.params.lon);

        global.models.Point.find({
            coordinates: {
                $near: {
                    $maxDistance: 100 / 111.12,
                    $geometry: {
                        type: 'Point',
                        coordinates: [req.params.lon, req.params.lat]
                    }
                }
            }
        }, function (err, res) {
            if (err) {
                return console.log(err);
            }
            console.log(res);
        });
    }); 

Объект в том виде, в котором он хранится в коллекции базы данных:

{ 
    "_id" : ObjectId("56ea103eefedec96b6d4b203"), 
    "title" : "Some title", 
    "coordinates" : [
        5.2260167, 
        52.3500607
    ]
}

person Ariel Weinberger    schedule 29.03.2016    source источник
comment
Прочтите документацию. $nearSphere. Вам не нужны отдельные свойства. Документация расскажет вам, как ваш документ должен хранить данные.   -  person Blakes Seven    schedule 29.03.2016


Ответы (1)


В вашей схеме вам нужно определить поле следующим образом:

location: { 
  type: [ Number ], 
  default: [ 0, 0 ], 
  index: '2dsphere' 
}

Затем вы можете выполнять операции поиска на нем следующим образом:

Model.find({
  location: {
    $near: {
      $maxDistance: 100/111.12, // 100km
      $geometry: { 
        type: "Point", 
        coordinates: [151.1114885, -33.9493992] // [lon, lat]    
      }
    }
  }
}).exec(callback);

Пояснение к $maxDistance:

1° latitude = 69.047 miles = 111.12 kilometers

person oleh.meleshko    schedule 29.03.2016
comment
Эй, спасибо за ответ. Нужно ли мне определять поля, определенные при запуске модели, используя mongoose modelSchema? Я сделал это, и в результате я получаю неопределенность... - person Ariel Weinberger; 29.03.2016
comment
Я получаю пустой объект, должно быть что-то не так в моей схеме. Я обновлю свой вопрос определением схемы. Буду признателен за помощь. Спасибо большое Олег. - person Ariel Weinberger; 29.03.2016
comment
Координаты @ArielWeinberger должны быть полем массива, а не объектом. Пожалуйста, проверьте мой ответ еще раз - person oleh.meleshko; 29.03.2016
comment
Привет. На самом деле я забыл отредактировать, но я использовал его как массив, как и вы, но в результате я все равно получаю пустой массив :( - person Ariel Weinberger; 29.03.2016
comment
Я также отредактировал и добавил документ, так как он хранится в коллекции, возможно, я что-то не так сделал... - person Ariel Weinberger; 29.03.2016