翻译或纠错本页面

创建Haystack索引

haystack索引必须包含两个键:位置键和第二个键。第二个键是用于精确匹配的。haystack索引会基于位置和对附加的查询条件的精确匹配来返回文档。haystack索引不适用于需要返回离某个位置最近的结果的情况。

使用如下格式创建haystack索引:

db.coll.createIndex( { <location field> : "geoHaystack" ,
                       <additional field> : 1 } ,
                     { bucketSize : <bucket value> } )

在创建索引时,您必须指定 bucketSize 选项才能创建haystack索引。例如 bucketSize 的值为 5 时,会创建一个索引,这个索引会将与某个特定位置的经度,纬度相差5个单位以内的所有位置都放在同一个区域组内。 bucketSize 决定了索引的粒度。您可以调整这个参数以适应您的数据的分布,这样您的查询在通常情况下将只需要搜索非常小的区域。由bucket确定的区域是可以互相覆盖的。同一篇文档可以出现在多个bucket中。

例子

如果您的集合中的文档有如下相似键:

{ _id : 100, pos: { lng : 126.9, lat : 35.2 } , type : "restaurant"}
{ _id : 200, pos: { lng : 127.5, lat : 36.1 } , type : "restaurant"}
{ _id : 300, pos: { lng : 128.0, lat : 36.7 } , type : "national park"}

以下操作可以创建一个haystack索引,其中的bucket会存储

db.places.createIndex( { pos : "geoHaystack", type : 1 } ,
                       { bucketSize : 1 } )

这个索引会将 _id 值为 200 的文档存储在如下两个bucket中:

  • 其中一个bucket中还包含了 _id 值为 100 的文档

  • 另一个bucket中还包含了 _id 值为 300 的文档

您可以在 geoSearch 命令里查询haystack索引。参见 查询Haystack索引 了解更多。

默认情况下,使用了haystack索引的查询会返回50篇文档。