0

我已经成功获得

 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" } )

我的查询一定是错误的,因为我一定不了解子文档是如何正常工作的。

有任何想法吗?

谢谢。

4

0 回答 0