翻译或纠错本页面
创建Haystack索引¶
haystack索引必须包含两个键:位置键和第二个键。第二个键是用于精确匹配的。haystack索引会基于位置和对附加的查询条件的精确匹配来返回文档。haystack索引不适用于需要返回离某个位置最近的结果的情况。
使用如下格式创建haystack索引:
db.coll.ensureIndex( { <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.ensureIndex( { pos : "geoHaystack", type : 1 } ,
{ bucketSize : 1 } )
这个索引会将 _id 值为 200 的文档存储在如下两个bucket中:
其中一个bucket中还包含了 _id 值为 100 的文档
另一个bucket中还包含了 _id 值为 300 的文档
您可以在 geoSearch 命令里查询haystack索引。参见 查询Haystack索引 了解更多。
默认情况下,使用了haystack索引的查询会返回50篇文档。