【问题标题】:Best way to sort on multiple fields in geonear query在 geonear 查询中对多个字段进行排序的最佳方法
【发布时间】:2011-05-26 00:20:53
【问题描述】:

在 MongoDB 中,我正在对包含约 350 万个对象的集合进行地理查询,以返回接近某个纬度/经度的结果。如果我在对象上有一个基本的 2d 索引,则此查询运行良好:

db.Listing.ensureIndex( { Coordinates: "2d" } );

但是现在我还想在 geonear 查询中按其他字段(价格、房产类型、建造年份、床、浴室等)进行过滤。当我向查询中添加价格

我尝试为每个其他字段添加单独的索引(集合上的总索引为 11 个),但这使得每次查询都超时,我猜是因为集合只能处理这么多索引?

db.Listing.ensureIndex( { Coordinates: "2d" } );
db.Listing.ensureIndex( { Price: 1 } );
db.Listing.ensureIndex( { Beds: 1 } );
db.Listing.ensureIndex( { Baths: 1 } );
etc...

现在我正在考虑在集合中只有 1 个复合索引,如下所示:

db.Listing.ensureIndex( { Coordinates: "2d", Price: 1, PropertyType: 1, YearBuilt: 1, Beds: 1, Baths: 1, HouseSize: 1, LotSize: 1, Stories: 1 } );

这是正确的方法还是有更好的方法?

【问题讨论】:

    标签: mongodb


    【解决方案1】:

    是的,复合索引可能是要走的路。有关详细信息,请参阅http://www.mongodb.org/display/DOCS/Geospatial+Indexing#GeospatialIndexing-CompoundIndexes

    我在这里看到的唯一问题是该索引中有很多字段,这将使其相当大,因此您可能只想在具有高基数的字段上创建索引。使用 explain() 来优化它。

    此外,鉴于您的数据集,可能很难保持索引的正确平衡(因此当物理内存用完时它会开始撞击磁盘),这会大大减慢速度。

    【讨论】:

      猜你喜欢
      • 2019-03-30
      • 2020-10-22
      • 1970-01-01
      • 2014-09-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-09
      相关资源
      最近更新 更多