子文档C#上的MongoDB地理空间查询

时间:2015-02-13 12:09:12

标签: c# mongodb geospatial subdocument

我成功了

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

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

有什么想法吗?

感谢。

0 个答案:

没有答案