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']]] }
しかし、これには2つの問題があります。
「type」というフィールドがあると、フォームフィールドでフィールドを定義できるため、Mongooseのスキーマ解析が台無しになります:{type:、index:}など。
Mongooseはネストされた配列を好みません。
これを克服する1つの方法は、単にmongoose.Schema.Types.Mixed
、しかし、私はより良い方法がなければならないと感じています!
配列の配列を表すにはMixedを使用する必要があります。将来的にこれをサポートするための オープンチケット があります。
@nevi_meは正しいので、彼が説明したようにtype
プロパティを宣言する必要があります。
ここに要点があります: https://Gist.github.com/aheckmann/5241574
他のアイデアについては、mongooseテストを参照してください。 https://github.com/LearnBoost/mongoose/blob/master/test/model.querying.test.js#L1931
参考のために、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)
mongoose-geojson-schema パッケージは、MongooseスキーマでGeoJSONを簡単に使用できるように作成されました。
今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
。これはスキーマレベルで機能するため、必要なスキーマで使用します。
MongoDB内のすべての場所参照を'2d'
からGeoJSONに移動しようとしているので、同じ問題が発生します。
type
の問題に関しては、それを機能させるために、以下で行ったことに従わなければなりません。 Mongooseはそれを文字列として正しく認識します。mongoose.Schema.Types.Mixed
が機能することに同意しますが、以下で行ったことを試してみてください。機能するかどうかを教えてください。スキーマを試すためにmongoをインストールしたPCの近くにはいません。スキーマの定義方法は次のとおりです。ネストされた配列は動作するように調整できるため、動作しない場合はお知らせください。
var LocationObject = new Schema ({
'type': {
type: String,
required: true,
enum: ['Point', 'LineString', 'Polygon'],
default: 'Point'
},
coordinates: [
[
{ type: [ Number ]
]
]
});
Array
のネストで望ましくない結果が得られる場合は、代わりにこれを試してください。基本的に、より深くネストします。
coordinates: [
{ type: [
{ type: [ Number ] }
] }
]