usando node example cómo crear mongodb schema mongoose geospatial geojson

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:

  1. 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.

  2. 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)




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.