MongoDB деформирана геометрия с geojson

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

Когато се опитвам да запазя geojson документ в db, получавам следната грешка:

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/, ако увия полетата в кавички, но трябва не е необходимо да правите това (и не може за 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