我成功了
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个Foos的List。所以它没有成功检查Foos是否在聚合物中。
从我眼前的窗口:
locations
Count = 1
[0]: {MyGeo.GeoTest.Location}
locations[0].Locations
Count = 408
我期望根据聚合物过滤列表位置。
谁能告诉我哪里出错了?我在网上搜索过,似乎没有很多这种结构的例子,但是documentation说你可以按照我的方式获得索引。
您也可以将位置数据建模为a内的字段 子文档。在这种情况下,文档将包含一个字段(例如 地址),包含每个文档都有的文档数组 保存位置坐标的字段(例如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" } )
我的查询一定是错的,因为我不能理解子文档如何正常工作。
有什么想法吗?
感谢。