2013-03-21 2 views
27

MongoDB 2.4 позволяет использовать объекты GeoJSON и убить neat functions and indexes, которые я бы хотел использовать.Как можно представить поля MongoDB GeoJSON в схеме Mongoose?

Он ожидает, что объекты GeoJSON должны быть сохранены в формате, как:

loc: { 
    type: 'Polygon', 
    coordinates: [[[-180.0, 10.0], [20.0, 90.0], [180.0, -5.0], [-30.0, -90.0]]] 
} 

Так Mongoose можно было бы подумать схемы будет определяться как:

loc: { type: 'string', coordinates: [[['number']]] } 

Но это настоящее время две проблемы:

  1. , имеющий поле под названием «тип», крепирует схему схемы Mongoose , потому что он позволяет определять поля в поле формы: {type:, index:} и т. Д.

  2. Mongoose не любит вложенные массивы.

Один из способов преодолеть это просто использовать mongoose.Schema.Types.Mixed, однако я чувствую, что там должен быть лучший путь!

ответ

15

Вы должны использовать Mixed для представления массивов массивов. Для поддержки этого в будущем существует open ticket.

@nevi_me является правильным, вы должны объявить свойство type, как он описал.

Вот суть: https://gist.github.com/aheckmann/5241574

Смотрите тесты мангуста здесь больше идей: https://github.com/LearnBoost/mongoose/blob/master/test/model.querying.test.js#L1931

+3

Спасибо! Было бы неплохо увидеть объяснение этого в документах Mongoose. – Will

+1

Спасибо! type: {type: String} решить мою проблему – damphat

3

Я собираюсь переместить все ссылки на свои ссылки в моем MongoDB с '2d' на GeoJSON, так что я столкнусь с той же проблемой.

  • Что касается проблемы с type, вам необходимо следить за тем, как я это сделал, чтобы заставить его работать. Mongoose правильно распознает его как строку.
  • Вложенные массивы; Я согласен с тем, что mongoose.Schema.Types.Mixed будет работать, но я думаю, вы можете попробовать, что я сделал ниже, сообщите мне, если это сработает. Я не рядом с ПК с монго, установленным для проверки схемы.

Вот как бы я определил схему. Вложенный массив можно настроить, чтобы работать, поэтому дайте мне знать, если это не так.

var LocationObject = new Schema ({ 
    'type': { 
    type: String, 
    required: true, 
    enum: ['Point', 'LineString', 'Polygon'], 
    default: 'Point' 
    }, 
    coordinates: [ 
    [ 
     { type: [ Number ] 
    ] 
    ] 
}); 

Если вы получаете нежелательные результаты в нестингу Array, попробовать это вместо этого. В основном гнездование глубже.

coordinates: [ 
    { type: [ 
    { type: [ Number ] } 
    ] } 
] 
41

Для справки, GeoJSON официально поддерживается в Mongoose 3.6

See the release notes here.

Пример (из документации):

new Schema({ loc: { type: [Number], index: '2dsphere'}}) 

... потом ...

var geojsonPoly = { type: 'Polygon', coordinates: [[[-5,-5], ['-5',5], [5,5], [5,-5],[-5,'-5']]] } 

Model.find({ loc: { $within: { $geometry: geojsonPoly }}}) 
// or 
Model.where('loc').within.geometry(geojsonPoly) 
+0

Как вам сохранить GeoJson Point с помощью этой схемы? – Danpe

+1

Вы просто устанавливаете значение пути 'loc' для массива следующим образом:' item.loc = [lng, lat]; item.save() ' –

+3

Спасибо, Но как определяется тип? Например, если мне нужно определить Polygon или Line или Multi Point? – Danpe

4

Пакет mongoose-geojson-schema был создан, чтобы сделать его легко иметь в формате GeoJSON Mongoose Schemas.

4

Mongoose сейчас officially supports this.

Вкратце, что вы делаете, для этой схемы вы используете настройку typeKey, чтобы указать мангусте использовать другой ключ для информации о типе. Вот пример:

var schema = new Schema({ 
    // Mongoose interpets this as 'loc is an object with 2 keys, type and coordinates' 
    loc: { type: String, coordinates: [Number] }, 
    // Mongoose interprets this as 'name is a String' 
    name: { $type: String } 
}, { typeKey: '$type' }); // A '$type' key means this object is a type declaration 

Так что теперь вместо того, чтобы объявить тип информации с type собственности, вы используете $type. Это работает на уровне схемы, поэтому используйте его в схемах, которые в ней нуждаются.

+0

Вы попробовали '$ where' в запросе? https://docs.mongodb.com/manual/reference/operator/query/where/ –

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