我已经成功获得
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"));
但是,当我将文档更改为包含一个带有 Foos 数组的子文档时,如下所示:
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 对象,那么在我对子文档运行查询后,它会返回一个 List,其中 Locations 是一个具有 400 个 Foo 的列表。所以它没有成功检查 Foos 是否在 poly 中。
从我的即时窗口:
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" } )
我的查询一定是错误的,因为我一定不了解子文档是如何正常工作的。
有任何想法吗?
谢谢。