29

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. 「タイプ」と呼ばれるフィールドを持つと、フォーム フィールドでフィールドを定義できるため、Mongoose のスキーマ解析が台無しになります: { type: 、 index: } など。

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

これを克服する 1 つの方法は、単純に を使用するmongoose.Schema.Types.Mixedことですが、もっと良い方法が必要だと思います!

4

5 に答える 5

49

参考までに、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)
于 2013-03-30T03:04:30.573 に答える
15

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

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

要点は次のとおりです: https://gist.github.com/aheckmann/5241574

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

于 2013-03-25T22:50:39.067 に答える
5

Mongooseはこれを公式にサポートするようになりました。

簡単に言えば、そのスキーマに対して、typeKey設定を使用して、タイプ情報に別のキーを使用するようにマングースに指示します。次に例を示します。

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

于 2016-11-27T15:22:58.907 に答える
4

MongoDB内のすべてのロケーション参照をGeoJSONに移動し始めよ'2d'うとしているので、同じ問題が発生します。

  • 問題に関しては、type私が以下で行ったことに従わなければなりません。マングースはそれを文字列として正しく認識します。
  • ネストされた配列; 私はそれがうまくいくことに同意し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 ] }
  ] }
]
于 2013-03-22T12:41:20.950 に答える