web-dev-qa-db-ja.com

MongooseスキーマでMongoDB GeoJSONフィールドをどのように表しますか?

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つの問題があります。

  1. 「type」というフィールドがあると、フォームフィールドでフィールドを定義できるため、Mongooseのスキーマ解析が台無しになります:{type:、index:}など。

  2. Mongooseはネストされた配列を好みません。

これを克服する1つの方法は、単にmongoose.Schema.Types.Mixed、しかし、私はより良い方法がなければならないと感じています!

29
Zugwalt

配列の配列を表すにはMixedを使用する必要があります。将来的にこれをサポートするための オープンチケット があります。

@nevi_meは正しいので、彼が説明したようにtypeプロパティを宣言する必要があります。

ここに要点があります: https://Gist.github.com/aheckmann/5241574

他のアイデアについては、mongooseテストを参照してください。 https://github.com/LearnBoost/mongoose/blob/master/test/model.querying.test.js#L1931

15
aaronheckmann

参考のために、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)
47
Jed Watson

mongoose-geojson-schema パッケージは、MongooseスキーマでGeoJSONを簡単に使用できるように作成されました。

5
Mark Stosberg

今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。これはスキーマレベルで機能するため、必要なスキーマで使用します。

4
arg20

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 ] }
  ] }
]
4
nevi_me