MongoDB 2.4 permet l'utilisation de GeoJSON objets et une flopée de fonctions et index soignés que j'aimerais utiliser.
Il s'attend à ce que les objets GeoJSON soient stockés au format comme:
loc: {
type: 'Polygon',
coordinates: [[[-180.0, 10.0], [20.0, 90.0], [180.0, -5.0], [-30.0, -90.0]]]
}
Donc, dans Mongoose, on pourrait penser que le schéma serait défini comme:
loc: { type: 'string', coordinates: [[['number']]] }
Mais cela pose deux problèmes:
avoir un champ appelé "type" gâche l'analyse du schéma de Mongoose car cela permet de définir des champs dans le champ du formulaire: {type:, index:} etc.
Mongoose n'aime pas les tableaux imbriqués.
Pour résoudre ce problème, vous pouvez simplement utiliser mongoose.Schema.Types.Mixed
, mais je pense qu'il doit y avoir une meilleure façon!
Vous devez utiliser Mixed pour représenter des tableaux de tableaux. Il y a un ticket ouvert pour soutenir cela à l'avenir.
@nevi_me est correct, vous devez déclarer la propriété type
comme il l'a décrit.
Voici un résumé: https://Gist.github.com/aheckmann/5241574
Voir les tests de mangouste ici pour plus d'idées: https://github.com/LearnBoost/mongoose/blob/master/test/model.querying.test.js#L1931
Pour référence, GeoJSON est officiellement pris en charge dans Mongoose 3.6
Voir les notes de version ici .
Exemple (extrait des documents):
new Schema({ loc: { type: [Number], index: '2dsphere'}})
... puis ...
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)
Le package mongoose-geojson-schema a été créé pour faciliter l'intégration de GeoJSON dans les schémas Mongoose.
Mangouste maintenant prend officiellement en charge cela .
En résumé, ce que vous faites, c'est que pour ce schéma, vous utilisez le paramètre typeKey
pour dire à mangouste d'utiliser une clé différente pour les informations de type. Voici un exemple:
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
Alors maintenant, au lieu de déclarer les informations de type avec la propriété type
, vous utilisez $type
. Cela fonctionne au niveau du schéma, alors utilisez-le dans les schémas qui en ont besoin.
Je suis sur le point de commencer à déplacer toutes mes références de localisation dans mon MongoDB de '2d'
à GeoJSON, donc je vais rencontrer le même problème.
type
, vous devez suivre ce que j'ai fait ci-dessous pour le faire fonctionner. Mongoose le reconnaît correctement comme une chaîne.mongoose.Schema.Types.Mixed
fonctionnera, mais je pense que vous pouvez essayer ce que j'ai fait ci-dessous, faites-moi savoir si cela fonctionne. Je ne suis pas près d'un PC avec mongo installé pour essayer le schéma.Voici comment je définirais le schéma. Le tableau imbriqué peut être modifié pour fonctionner, alors faites-le moi savoir si ce n'est pas le cas.
var LocationObject = new Schema ({
'type': {
type: String,
required: true,
enum: ['Point', 'LineString', 'Polygon'],
default: 'Point'
},
coordinates: [
[
{ type: [ Number ]
]
]
});
Si vous obtenez des résultats indésirables dans l'imbrication du Array
, essayez plutôt cela. Nidification essentiellement plus profonde.
coordinates: [
{ type: [
{ type: [ Number ] }
] }
]