Неверная геометрия MongoDB с geojson

Использование MongoDB v2.6.5

Когда я пытаюсь сохранить документ geojson в БД, я получаю следующую ошибку:

name: 'MongoError',
  code: 16755,
  err: 'insertDocument :: caused by :: 16755 Can\'t extract geo keys from object, malformed geometry?: { _id: ObjectId(\'55271b90d075728028d4c9e1\'), ..., location: [ { _id: ObjectId(\'55271b90d075728028d4c9e3\'), loc: { type: "Point", coordinates: [ -105.01621, 39.57422 ] } } ] } ], status: [ "lead" ], created: new Date(1428626320406), lastName: "Doe", firstName: "John", __v: 0 }' }

Я пытаюсь вставить точку в таблицу с индексом 2dsphere, и все это управляется через MongooseJS, как показано ниже.

var GeoAddressSchema = new Schema({
    // Only holds points.
    loc: {
        type: { type: String },
        coordinates: []
    }
});


var Lead = new Schema({
    // Other fields  ...
    location: [GeoAddressSchema],
    // ...
});

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

Сохраняемый геоджсон:

{ type: "Point", coordinates: [ -111.855211, 33.58513 ] }

Geojson действителен в соответствии с: http://geojsonlint.com/, если я заключаю поля в кавычки, но я должен не нужно этого делать (и не может для Mongo afaik).

Кто-нибудь знает, почему это не удастся? Это выглядит правильно.

Ссылки

MongoDB GeoJSON: http://docs.mongodb.org/manual/reference/geojson/

MongoDB 2dSphere: http://docs.mongodb.org/manual/core/2dsphere/


person Donn Felker    schedule 10.04.2015    source источник
comment
GeoJSON указывает в сообщениях об ошибках и публикует в вашем вопросе оба индекса, которые мне подходят. Какую версию MongoDB вы используете? Можете ли вы опубликовать минимальный пример, который вам не подходит?   -  person wdberkeley    schedule 10.04.2015


Ответы (1)


Первое наблюдение: вам не нужно вводить путь loc в структуру местоположения.

Кроме того, вам даже не нужно определять отдельную схему для вашего поля location в схеме Lead.

Попробуй это:

var Lead = new Schema({
  // Other fields  ...
  location: {
    type: {
      type: 'String',
      default: 'Point'  // and optionally skip including `type: String` everywhere
    },
    coordinates: {
      type: [Number]
    }
  },
  // More fields ...
});

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

Еще одна проблема, с которой я столкнулся, заключалась в том, что индекс 2dsphere перепутался при поиске и тестировании решений. Поэтому попробуйте удалить индекс или, что еще лучше, коллекцию после внесения структурных изменений в схему.

> db.lead.drop();  // on the mongo console`
person SarathMS    schedule 10.04.2015
comment
Это было прекрасно. Спасибо. Это также упростило большую часть моего кода. Я очень ценю это! - person Donn Felker; 10.04.2015
comment
Кстати, я также столкнулся с проблемой индекса, о которой вы говорили. Пришлось бросить, а потом -прочитать. Именно это привело меня к осознанию того, что моя первоначальная реализация была неправильной. Это работало локально. Затем я отправил его в среду CI и понял, что он сломан. - person Donn Felker; 10.04.2015
comment
Может объясните как сбросить индекс и как еще заменить индекс? - person Thinkerer; 25.07.2015
comment
ВЫ СПАСЛИ МНЕ ЖИЗНЬ, после 2 дней попыток я прочитал ваш ответ, что хорошо отказаться от коллекции, и это была моя проблема. Спасибо, мужик - person Leandro Hoffmann; 12.05.2016