地理空间索引限制
2d 和 2dsphere 索引是地理空间索引。地理空间索引有以下限制:
排序规则选项
2d 索引不支持排序规则选项,仅支持二进制比较。二进制比较是通过比较每个字符串中每个字符的 Unicode 数值进行的,不考虑字母大小写或重音符号。
要在具有非简单排序规则的collection上创建 2d 索引,您必须在创建索引时显式指定 { collation: { locale: "simple"
} }
。
例如,考虑一个名为 collationTest
的集合,其排序规则为 { locale: "en" }
:
db.createCollection( "collationTest", { collation: { locale: "en" } } )
要在collationTest
集合上创建 2d 索引,您必须指定{ collation: { locale: "simple" } }
。 此命令在loc
字段上创建 2d 索引:
db.collationTest.createIndex( { loc: "2d" }, { collation: { locale: "simple" } } )
覆盖查询
地理空间索引无法涵盖查询。
片键
不能将地理空间索引用作分片键。但是,您可以通过使用不同字段作为分片键在分片集合上创建地理空间索引。
多个地理空间索引 $geoNear
如果集合具有多个地理空间索引,则在运行 $geoNear
管道阶段时,必须指定 $geoNear
key
选项。key
选项指定使用哪个索引来支持查询。
支持的数据类型
使用 2dsphere 索引建立索引的字段必须包含几何数据。几何数据可以是:
您无法:
将包含非几何数据的文档插入使用2 dsphere索引进行索引的字段中。
在包含非几何数据的字段上构建 2dsphere 索引。
索引键数量
创建 2dsphere 索引时,mongod
会将 GeoJSON 形状映射到内部表示。生成的内部表示可能是很大的值数组。
indexMaxNumGeneratedKeysPerDocument
设置限制为单个文档生成的最大键数,防止出现内存不足错误。如果操作需要的键数多于 indexMaxNumGeneratedKeysPerDocument
参数指定的键数,则操作将失败。
默认情况下,服务器允许每个文档最多有 100,000
个索引键。要允许更多索引键,请提高 indexMaxNumGeneratedKeysPerDocument
值。
在平面上进行精确匹配
2d 索引无法提高坐标对精确匹配的性能。
例如,考虑包含以下文档的 contacts
集合:
db.contacts.insertMany( [ { name: "Evander Otylia", phone: "202-555-0193", address: [ 55.5, 42.3 ] }, { name: "Georgine Lestaw", phone: "714-555-0107", address: [ -74, 44.74 ] } ] )
address
字段上的 2d 索引不会提高以下查询的性能:
db.contacts.find( { address: [ 55.5, 42.3 ] } )
若要提高此查询的性能,请在 address
字段上创建升序或降序索引:
db.contacts.createIndex( { address: 1 } )