

Node.js で mongoose を通して MongoDB を使っています。その中で、画面上の位置情報を持つデータを考えて、

[code]

    {
      location: {
        x: Number,
        y: Number
      }
    }
    
[/code]

と言うスキーマを定義しました。そこで、ある与えられた点から一定の距離の中にあるデータを取得するようなコードが書きたいです。そこで、`(x-x_0)^2+(y-y_0)^2`
の値を計算してそれの大きさで条件を通さなければいけないと思うのですが、どうしたらいいのか分かりません。 SQL での

[code]

    SELECT * FROM 'locations' WHERE (x-x_0)^2+(y-y_0)^2 < radius^2
    
[/code]

みたいなことがしたいです。ご存知の方教えてください。よろしくお願いします。


CC BY-SA 3.0
2015-01-19T21:50:16.027
4865
2015-01-20T03:13:40.333
2015-01-19T23:21:20.723
4978
7562
question
node.js mongodb
MongoDB を使い、位置情報でドキュメント検索をしたい


[2dインデックス](http://docs.mongodb.org/manual/core/2d/)を使うと、[`geoNear`](http://docs.mongodb.org/manual/reference/command/geoNear/)で検索できます。


CC BY-SA 3.0
2015-01-20T02:19:32.997
4876
2015-01-20T02:19:32.997
3066
4865
answer


位置・座標情報の検索を行う場合、MongoDB がデフォルトでサポートしている [Geospatial
Index](http://docs.mongodb.org/manual/administration/indexes-geo/)
を利用するのが良いかと思います。

今回の場合、緯度経度のような球体座標ではないので、[2d
Index](http://docs.mongodb.org/manual/tutorial/build-a-2d-index/) を利用すればいいです。

以下、`mongo shell` での実行例です。

[code]

    // points コレクションの location キーに 2d Index を設定
    db.points.ensureIndex(
      { location: '2d' },
      { min: {'x': 0, 'y': 0}, max: {'x': 100, 'y': 100} }
    );
    
    // テスト用データを生成
    for (var x = 0; x < 100; ++x) {
      for (var y = 0; y < 100; ++y) {
        // 普通に保存するだけ
        db.points.save({ location: {x: x, y: y} });
      }
    }
    
    // 検索処理
    db.points.find({
      location: {
        // {x: 30, y:70} から 3 以内の距離に含まれるデータを検索
        $geoWithin: {
          $center: [{x: 30, y:70}, 3]
        }
      }
    });
    
[/code]

上記例ではあるポイントからの距離（円の範囲）での検索を行っていますが、他に、四角形や多角形の範囲内で検索を行えます。詳細についてはMongoDBのマニュアル:
[Query a 2d Index](http://docs.mongodb.org/manual/tutorial/query-a-2d-index/)
を確認してください。


CC BY-SA 3.0
2015-01-20T03:13:40.333
4880
2015-01-20T03:13:40.333
2944
4865
answer