SailsJS geoNear Проблемы

У меня было много проблем с тем, чтобы заставить geoNear работать в SailsJS.

В моем UserController.js я пытаюсь сделать запрос geoNear в поле location в моей пользовательской модели. Он определяется как JSON с 2d-индексом. Вот пример данных поля:

"location" : { "type" : "Point" , "coordinates" : [ 42.8003 , -73.8808 ]}

В моем UserController мой метод геопоиска выглядит так:

 geoSearch: function(req, res) {
    //sails.log.verbose(req);
    var lat = req.param('lat');
    var lng = req.param('long');
    var limit = req.param('limit') || 50;
    var maxDistance = req.param('radius') || 5000; //meters
    sails.log.verbose('lat : ' + lat);
    sails.log.verbose('lng : ' + lng);
    sails.log.verbose('limit : ' + limit);
    sails.log.verbose('maxDistance : ' + maxDistance);
    if (!(lat && lng)) {
        //bad stuff
        res.badRequest('Missing lat or long!');
    } else {
        User.native(function(err, collection) {
          collection.geoNear(lng, lat, {
                    limit: limit,
                    maxDistance: maxDistance, // in meters
                    query: {}, // allows filtering
                    distanceMultiplier: 3959, // converts radians to miles (use 6371 for km)
                    spherical : true
          }, function(mongoErr, users) {
                  if (mongoErr) {
                      console.error(mongoErr);
                      res.send('_geoSearch failed with error='+mongoErr);
                  } else {
                      console.log('users=',users);
                      res.json(users.results);
                    }
             });
        });
    }
}

Однако, когда я делаю запрос, например:

http://localhost:1337/api/user/location/?lat=42.8003&long=-73.8808

Я получаю вывод:

verbose: lat : 42.8003
verbose: lng : -73.8808
verbose: limit : 50    
verbose: maxDistance : 5000
{ [MongoError: exception: 'near' field must be point]
  name: 'MongoError',
  errmsg: 'exception: \'near\' field must be point',
  code: 17304,
  ok: 0 }

Я боролся с этим довольно долгое время, любая помощь или руководство будут оценены.

Дополнительная информация:

MongoDB ~3.0 SailsJS ~0.10

https://github.com/mongodb/node-mongodb-native/blob/dd7bb687749ffab6ec4c4a6b052ef2cdffc0d780/lib/mongodb/collection.js#L1446

http://docs.mongodb.org/manual/reference/command/geoNear/


person Zach Leighton    schedule 04.03.2015    source источник
comment
Я должен знать, что такое geoNear? Кроме того, текущая версия не является. Ошибка довольно описательная: вы отправляете mongo что-то отличное от типа point   -  person Travis Webb    schedule 08.03.2015
comment
Я указал текущую версию #, а данные — это точка, когда я прохожу через отладчик. Я также пробовал устаревшие пары координат. Я также сослался на geoNear в спецификации mongoDB для вас.   -  person Zach Leighton    schedule 08.03.2015
comment
Кроме того, я пробовал использовать .aggregate и другие методы, всегда с одной и той же ошибкой.   -  person Zach Leighton    schedule 09.03.2015


Ответы (2)


У меня была такая же проблема, это вызвано:

Однако, когда я делаю запрос, например:

http://localhost:1337/api/user/location/?lat=42.8003&long=-73.8808

Поэтому, когда данные принимаются на стороне сервера, они преобразуются в «String». Попробуйте это решить:

    var latitude = parseFloat(req.param('lat'));
    var longitude = parseFloat(req.param('long'));

Надеюсь, это будет полезно.

person Elham Barzegar    schedule 08.04.2015
comment
У меня была точно такая же проблема с NodeJs. - person Gp2mv3; 27.07.2016

У меня были похожие проблемы, пока я не добавил это в свой файл bootstrap.js.

module.exports.bootstrap = function(cb) {
  // Ensure we have 2dsphere index on Property so GeoSpatial queries can work!
  sails.models.stores.native(function (err, collection) {
    collection.ensureIndex({ loc: '2dsphere' }, function () {

      // It's very important to trigger this callack method when you are finished
      // with the bootstrap!  (otherwise your server will never lift, since it's waiting on the bootstrap)
      cb();

    });
  });

};

По сути, вы гарантируете, что ваша коллекция имеет связанный с ней ключ 2d-сферы. Наконец, в файле модели не забудьте определить тип ключа, содержащего географические координаты, как json, как показано ниже:

module.exports = {

  attributes: {

    loc: {
      type: 'json'
    }

  }
};

Надеюсь, это поможет. Заботиться.

person Ady Ngom    schedule 30.03.2015
comment
Я попробовал это и решил, что буду двигаться вперед с другой технологией, так как поддержка Sails в настоящее время кажется довольно ограниченной. - person Zach Leighton; 30.03.2015
comment
Грустно слышать, это сработало для меня, и скорость просто потрясающая. От 100 записей до 5000 записей без заметного отставания в скорости. Я проведу стресс-тест сегодня вечером с 30000 записей. Надеюсь, вы когда-нибудь будете к нему возвращаться. Я точно не вернусь ни к чему другому. К вашему сведению, это для живого производства, а не для домашнего проекта. Заботиться. - person Ady Ngom; 31.03.2015