2015-04-10 4 views
0

Использование MongoDB v2.6.5MongoDB искаженной Геометрия с GeoJSON

При попытке сохранить 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' }); 

GeoJSON, что сохраняются:

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

GeoJSON действует в соответствии с: http://geojsonlint.com/ если я оберните поля в кавычках, но мне не нужно, чтобы сделать это (а может не Монго насколько мне известно).

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

Справочные ссылки

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

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

+0

GeoJSON указывает на сообщения об ошибках и отправил в ваш вопрос оба показателя для меня. Какую версию MongoDB вы используете? Можете ли вы опубликовать минимальный пример, который не подходит для вас? – wdberkeley

ответ

3

Первое наблюдение: вам не нужно вводить 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` 
+0

Это было прекрасно. Спасибо. Это также упростило мой код. Я очень ценю это! –

+1

BTW - Я также столкнулся с проблемой, о которой вы говорили. Я должен был упасть, а потом - понять это. Это то, что привело меня к осознанию моей первоначальной реализации, было неправильным. Он работал на местном уровне. Затем я подтолкнул его к среде CI и понял, что он сломан. –

+0

Может объяснить, как удалить индекс и как еще заменить индекс? – Thinkerer

Смежные вопросы