example - node js express mongodb rest api
¿Cómo se representan los campos MongoDB GeoJSON en un esquema Mongoose? (5)
MongoDB 2.4 permite el uso de objetos GeoJSON y una serie de funciones e índices que me gustaría utilizar.
Espera que los objetos GeoJSON se almacenen en el formato como:
loc: {
type: ''Polygon'',
coordinates: [[[-180.0, 10.0], [20.0, 90.0], [180.0, -5.0], [-30.0, -90.0]]]
}
Entonces, en Mongoose uno pensaría que el esquema se definiría como:
loc: { type: ''string'', coordinates: [[[''number'']]] }
Pero estos dos problemas actuales:
tener un campo llamado "tipo" estropea el análisis del esquema de Mongoose porque permite definir campos en el campo de formulario: {tipo:, índice:} etc.
A Mongoose no le gustan las matrices anidadas.
Una forma de superar esto es simplemente usar mongoose.Schema.Types.Mixed
, sin embargo, creo que tiene que haber una manera mejor.
Como referencia, GeoJSON es oficialmente compatible con Mongoose 3.6
Vea las notas de la versión aquí .
Ejemplo (de los documentos):
new Schema({ loc: { type: [Number], index: ''2dsphere''}})
... entonces ...
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)
Debe usar Mixto para representar matrices de matrices. Hay un boleto abierto para apoyar esto en el futuro.
@nevi_me es correcto, debe declarar la propiedad type
como lo describió.
Aquí hay una esencia: https://gist.github.com/aheckmann/5241574
Consulte las pruebas de mangostas aquí para obtener más ideas: https://github.com/LearnBoost/mongoose/blob/master/test/model.querying.test.js#L1931
El paquete mongoose-geojson-schema se creó para facilitar el uso de GeoJSON en Mongoose Schemas.
Estoy a punto de comenzar a mover todas mis referencias de ubicación en mi MongoDB de ''2d''
a GeoJSON, así que me encontraré con el mismo problema.
- En cuanto al problema de
type
, debes seguir lo que hice a continuación para que funcione. Mangosta lo reconoce correctamente como una cadena. - Matrices anidadas; Acepto que
mongoose.Schema.Types.Mixed
funcionará, pero creo que puedes probar lo que hice a continuación, avísame si funciona. No estoy cerca de una PC con mongo instalado para probar el esquema.
Así es como definiría el esquema. La matriz anidada puede modificarse para que funcione, por lo tanto, avíseme si no lo hace.
var LocationObject = new Schema ({
''type'': {
type: String,
required: true,
enum: [''Point'', ''LineString'', ''Polygon''],
default: ''Point''
},
coordinates: [
[
{ type: [ Number ]
]
]
});
Si obtiene resultados no deseados en el anidamiento de la Array
, intente esto en su lugar. Básicamente anidando en más profundo.
coordinates: [
{ type: [
{ type: [ Number ] }
] }
]
Mangosta ahora oficialmente apoya esto .
En pocas palabras, lo que hace es, para ese esquema, usar la configuración typeKey
para decirle a la mangosta que use una clave diferente para la información del tipo. Aquí hay un ejemplo:
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
Así que ahora, en lugar de declarar información de tipo con la propiedad type
, usa $type
. Esto funciona en el nivel de esquema, así que úselo en los esquemas que lo necesiten.