8

次のようなmongoコレクションがあります。

{
"_id": {
    "$oid": "50e9f38fbd7680c8090bcb4"
},
"guid": "D3G5wQ8RZL",
"lat": 37.503287248864,
"lng": -121.97620341421,

C# linq を使用して "NEAR" クエリを実行したい

それはそのように見える必要があります

query = query.Where(x => LinqToMongo.Inject(Query.Near("Location", -96.770401, 32.816774, 20)));

私の質問は-「場所」の代わりに何をコーディングする必要がありますか? 上記のコレクションのポイントを確認するにはどうすればよいですか?

ありがとう。

4

1 に答える 1

20

MongoDB 2.4 以降では、GeoJSON を格納してインデックスを作成します。ここですべての概念を見つけることができます。

POCO タイプで GeoJSON プロパティを定義する方法:

public class Foo
{
  public GeoJsonPoint<GeoJson2DGeographicCoordinates> Location { get; set; }
}

インスタンス化の例:

var docToInsert = new Foo
            {   
                Location = new GeoJsonPoint<GeoJson2DGeographicCoordinates>(
                    new GeoJson2DGeographicCoordinates(-121.97620341421, 37.503287248864))
            });

$nearには地理空間インデックスが必要です。また、GeoJSON を格納しているため、具体的には 2dsphere インデックスが必要です。

var collection = //get MongoCollection<Foo> from MongoDatabase object
collection.EnsureIndex(IndexKeys<Foo>.GeoSpatialSpherical(x => x.Location));

今クエリ:

var point = GeoJson.Point(GeoJson.Geographic(-96.770401, 32.816774)); //long, lat

var locationClause = Query<Foo>.Near(y=> y.Location, point, 20); //20 is max distance from your question. note that it's in meters
IQueryable<Foo> query = collection.AsQueryable().Where( x=> locationClause.Inject()); 

//or with the non-generic Query:  
IQueryable<Foo> query = collection.AsQueryable().Where( x=> Query.Near("Location", point, 20).Inject());
于 2013-09-22T18:01:04.420 に答える