Подтвердить что ты не робот

Как вы представляете поля MongoDB GeoJSON в схеме Mongoose?

MongoDB 2.4 позволяет использовать GeoJSON объекты и множество опрятных функций и индексов, которые Я бы хотел использовать.

Он ожидает, что объекты 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']]] }

Но это две проблемы:

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

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

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

4b9b3361

Ответ 1

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

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

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

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

Ответ 2

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

См. примечания к выпуску здесь.

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

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)

Ответ 3

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

Ответ 4

Я собираюсь начать перемещать все мои ссылки на местоположение в моем 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 ] }
  ] }
]

Ответ 5

Mongoose теперь официально поддерживает это.

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

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. Это работает на уровне схемы, поэтому используйте его в схемах, которые в ней нуждаются.