MonogDB-索引(一)概述(二)

2014-11-24 17:10:05 · 作者: · 浏览: 1
使用的是 WGS84地球坐标系,存储的数据需要是GeoJSON格式的对象。 MongoDB目前支持三种类型的GeoJSON 对象:点 线 多变形 点: page18image16272 page18image16432{ loc : { type : "Point" , coordinates : [ 40, 5 ] }} 线:{ loc : { type : "LineString" , coordinates : [ [ 40 , 5 ] , [ 41 , 6 ] ]}} 多边形:{ loc : { type : "Polygon” , coordinates : [ [ [ 0 , 0 ] , [ 3 , 6 ] , [ 6 , 1 ] , [ 0 , 0 ] ] ] }}
注意:对于多边行来说,必须是闭合的,所有首尾两个点必须是相同的,这样的话一个多变形至少要有四个点。

球面索引支持按照GeoJSON对象和传统的经纬度对的数据,而后者是通过将传统的经纬度对转化为GeoJSON对象的Point类型来实现的,所以当我们存储地理位置信息的时候,最好按照GeoJSON对象的格式来进行存储。
MongoDB的二维球面索引支持所有的有关地理位置信息的查询:包含关系、相交关系、毗邻关系。 一个复合球面坐标索引可以包含一个文档的一个多个位置和非位置字段,可以将其按任意的顺序安排。 MongoDB 2.4版本使用的是WGS84坐标系来进行地理位置的相关计算,坐标轴的顺序为:<经度,纬度>。
注意: 1.只能在一个集合上创建一类位置索引:要么是2dsphere 或者是2d 2.不能将球面坐标索引作为片键 但是我们可以通过在一个分片集合上使用一个不同的字段作为片键,来使用球面坐标索引。
凹多边形的表示:
{ loc :
   { type : "Polygon" ,coordinates :
                [ 
                    [ [ 0 , 0 ] , [ 3 , 6 ] , [ 6 , 1 ] , [ 0 , 0 ] ],
                    [[2,2],[3,3],[4,2],[2,2]]
                ]
   }
}

注意:先写外层的多边形,后写内层多边形,内层多边形必须包含在外层多边形内,二者可以公用一条边。
详细使用方法参见:http://blog.csdn.net/crazy__programmer/article/details/23021073
平面索引 支持在欧几里德空间内计算位置关系,注意不能在包含GeoJSON对象的集合上使用2d索引。 点的存储:loc : [ , ]

f.哈希索引
支持基于哈希的分片集群,MongoDB提供了一个哈希索引的类型,将某一个字段的哈希值作为索引。使用哈希索引可以将数据随机的分配到集群中,如果使用哈希索引,需要注意的是哈希索引只支持匹配查询,不能进行范围查询。对于拥有子文档和数组的字段,不能使用哈希值来获取子文档。
可以使用下面的语句来建立一个哈希索引 db.active.ensureIndex( { a: "hashed" } )

g.文本索引 MongoDB提供了一个测试版的文本索引,用来快速查询一个集合中存储的字符串。 详细参考:http://docs.mongodb.org/manual/core/index-text/
三 索引属性
a.唯一索引 对于索引项不能有相同的值出现 db.addresses.ensureIndex( { "user_id": 1 }, { unique: true } )
如果在复合索引字段上建立唯一索引的话,MongoDB会强调复合字段内的值必须是唯一的,而不是单个字段唯一。 如果插入一个文档,该文档的唯一索引字段没有值的话,MongoDb会给其赋null值。MongoDB只允许这样的文档出现一次,如果再插入一个空值文档的话,会产生错误(duplicate key error)。
b.稀疏索引(Sparse Index) 确保文档只包含有索引字段,即使给字段是一个null值也是可以的。Spare索引相当于一个过滤器,如果我们在某个字段上建立spare索引,当在稀疏索引字段上执行查询语句的时候,如果某条文档不存在Spare索引字段的话,将不会包含到结果中。
例如:某个集合有以下三条文档:
{ "_id" : ObjectId("523b6e32fb408eea0eec2647"), "userid" : "newbie” } { "_id" : ObjectId("523b6e61fb408eea0eec2648"), "userid" : "abby", "score" : 82 } { "_id" : ObjectId("523b6e6ffb408eea0eec2649"), "userid" : "nina", "score" : 90 } 在 spare字段上建立一个稀疏索引 db.scores.ensureIndex( { score: 1 } , { sparse: true } )
然后我们执行查询: db.scores.find().sort( { score: -1 } ) 这样只有包含score字段的文档才会显示。

返回的结果将是: { "_id" : ObjectId("523b6e6ffb408eea0eec2649"), "userid" : "nina", "score" : 90 }
{ "_id" : ObjectId("523b6e61fb408eea0eec2648"), "userid" : "abby", "score" : 82 }
C.唯一索引和稀疏索引的联合使用 例如:某个集合有以下三条文档: { "_id" : ObjectId("523b6e32fb408eea0eec2647"), "userid" : "newbie” } { "_id" : ObjectId("523b6e61fb408eea0eec2648"), "userid" : "abby", "score" : 82 } { "_id" : ObjectId("523b6e6ffb408eea0eec2649"), "userid" : "nina", "score" : 90 } 在score字段上添加一个唯一索引和一个稀疏索引 db.scores.ensureIndex( { score: 1 } , { sparse: true, unique: true } )

建立上面的索引后,我们可以插入文档字socre字段上的值要么是唯一的,要不不存在score字段。 例如:db.scores.insert( { "userid": "PWWfO8lFs1", "score": 43 } ) db.scores.insert( { "userid": "XlSOX66gEy", "score": 34 } ) db.scores.insert( { "userid": "nuZHu2tcRm" } ) db.scores.insert( { "userid": "HIGvEZfdc5” } 以上的文档都是允许插入的。下面的两条是不让插入的,因为集合中已经存在了score位82和90的两条文档。 db.scores.insert( { "userid": "PWWfO8lFs1", "score": 82 } ) db.scores.insert( { "userid": "XlSOX66gEy", "score": 90 } )