创建干草堆索引

大海捞针索引必须引用两个字段:位置字段和第二个字段。第二个字段用于精确匹配。 Haystack 索引根据位置和完全相同的单个附加条件返回文档。这些索引不一定适合将最近的文档返回到特定位置。

要构建干草堆索引,请使用以下语法:

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

要构建干草堆索引,必须在创建索引时指定bucketSize选项。 _3 的bucketSize创建一个索引,该索引将位于指定经度和纬度 5 个单位内的位置值分组。 bucketSize还确定索引的粒度。您可以调整参数以适应数据的分布,以便通常只搜索很小的区域。桶定义的区域可以重叠。一个文档可以存在于多个存储桶中。

Example

如果您的文档集合中包含与以下内容类似的字段:

{ _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"}

以下操作使用存储在 1 个经度或纬度单位内的密钥的存储桶创建一个干草堆索引。

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

此索引将_id字段的值200存储在两个不同的存储桶中的文档:

  • 在包含文档的存储桶中,其中_id字段的值为100

  • 在包含文档的存储桶中,其中_id字段的值为300

要使用干草堆索引进行查询,请使用geoSearch命令。参见查询干草堆索引

默认情况下,使用干草堆索引的查询将返回 50 个文档。