Мангуст рядом с maxDistance, похоже, не имеет эффекта

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

Вот необработанный скрипт Mongo:

var conn = new Mongo(),
    db = conn.getDB("my_db"),
    collection;

collection = db.my_moodels.find({
  geo: {
    $nearSphere: {
      $geometry: {
        type: "Point",
        coordinates: [-0.02028, 51.50703]
      },
      $maxDistance: 3000 // 3k I'm assuming
    }
  }
});

print(collection.length()); // I get 6 (which is round about right)

Вот мой скрипт Mongoose:

MyModel
  .find()
  .where('geo')
  .near({
    center: [-0.02028, 51.50703],
    maxDistance: 3000,
    spherical: yes
  })
  .exec(function (err, results) {
    if (err) {
      throw err;
    } else {
      console.log(results.length); // Here I get over 340, which I think is all of the possible results.
    }
  });

Как видите, количество результатов совершенно другое. На самом деле изменение свойства maxDistance в скрипте Mongoose ничего не дает.

Может ли кто-нибудь увидеть, что мне здесь не хватает?


person johngeorgewright    schedule 02.04.2014    source источник
comment
Я только что обнаружил, что выполнение запроса непосредственно внутри метода .find() работает. Так что проблема должна быть в билдере Mongoose Query.   -  person johngeorgewright    schedule 03.04.2014


Ответы (1)


Я вижу, чего тебе здесь не хватает.

Согласно mongodb docs maxDistance указывается в метрах, только если ваш центр является объектом GeoJSON.

Поэтому, когда вы выполняете запрос с maxDistance: 3000, единицей измерения является радиан, и вы получаете все результаты. (Поскольку разница в радианах не может достигать 3000).

Вот рабочий запрос с построителем запросов мангуста и в метрах:

MyModel
  .find()
  .where('geo')
  .near({
    center: {type: 'Point', coordinates: [-0.02028, 51.50703]}, // <--
    maxDistance: 3000,
    spherical: yes
  })
  .exec(function (err, results) {
    if (err) {
      throw err;
    } else {
      console.log(results.length); // This should work.
    }
  });
person SafaOrhan    schedule 28.05.2017