無事ゲットしました
var locations = MongoCollection.Find(Query.Within<GeoJson2DGeographicCoordinates>("Position", poly))
私のドキュメントがこの構造を持っているときに正しい結果を返すには:
class Location
{
[BsonId]
public int Id { get; set; }
public string Address { get; set; }
public GeoJsonPoint<GeoJson2DGeographicCoordinates> Position { get; set; }
}
そしてこのインデックス:
MongoCollection.CreateIndex(IndexKeys.GeoSpatialSpherical("Position"));
ただし、次のようなFooの配列を持つサブドキュメントを含めるようにドキュメントを変更した瞬間:
class Location
{
[BsonId]
public int Id { get; set; }
public List<Foo> Locations {get;set;}
}
class Foo
{
public int Id { get; set; }
public string Address { get; set; }
public GeoJsonPoint<GeoJson2DGeographicCoordinates> Position { get; set; }
}
そして、次のようにサブドキュメント フィールドを使用するようにインデックスとクエリを変更します。
MongoCollection.CreateIndex(IndexKeys.GeoSpatialSpherical("Locations.Position"));
var locations = MongoCollection.Find(Query.Within<GeoJson2DGeographicCoordinates>("Locations.Position", poly)).AsQueryable().ToList();
期待どおりに動作しなくなります。上記のシナリオでは、1 つのアイテムを含む Location のリストが返されます。そのアイテムはすべて Foos です。
更新され た詳しく説明すると、400 個の Foo オブジェクトがある場合、サブドキュメントでクエリを実行すると、Locations が 400 個の Foo を持つリストであるリストが返されます。そのため、Foos がポリ内にあるかどうかを正常に確認できません。
私の直接の窓から:
locations
Count = 1
[0]: {MyGeo.GeoTest.Location}
locations[0].Locations
Count = 408
私が期待しているのは、リストの場所がポリゴンに基づいてフィルタリングされることです。
誰が私が間違っているのか教えてもらえますか? 私はオンラインで検索しましたが、この構造の例はあまりないようですが、ドキュメントには、私が持っている方法でインデックスを作成できると書かれています。
サブドキュメント内のフィールドとして位置データをモデル化することもできます。この場合、ドキュメントにはドキュメントの配列を保持するフィールド (アドレスなど) が含まれ、各ドキュメントには位置座標を保持するフィールド (loc: など) があります。例えば:
{ _id : ObjectId(...), name : "...", addresses : [ { context : "home" , loc : [ 55.5, 42.3 ] } , { context : "home", loc : [ -74 , 44.74 ] } ] }
次に、次の例のように、addresses.loc フィールドに地理空間インデックスを作成できます。
db.records.ensureIndex( { "addresses.loc": "2d" } )
サブドキュメントがどのように正しく機能するかを理解していないため、クエリが間違っているに違いありません。
何か案は?
ありがとう。