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