mongo(4)

mongodb学习记录(四)

索引属性

为索引指定索引名:

语法:db.[collection].ensureIndex({key1:1|-1,key2:1|-1},{name:"name"})
例子:在csbn表中创建一个名为“normal_index”的索引
    db.csbn.ensureIndex({name:1,age:1},{name:"normal_index"})

创建唯一(unique)索引:

释义:创建唯一索引。索引的关键字,不允许有重复的数据存在。比如以“nage”,“age”  
    为索引关键字。则不能存在name跟age一样的两条数据。
语法:db.[collection].ensureIndex({key1:1|-1,key2:1|-1},{unique:true})
例子:在csbn表中创建以name,age字段为索引,“normal_index”为索引名的唯一索引
    db.csbn.ensureIndex({name:1,age:1},{name:"normal_index",unique:true})

注意:比如csbn表中已经存在name为“aa  bb  cc”,age为“0”的document,如果再插入一条  
    name为“aa  bb  cc”,age为“0”的document,则会报以下错误:

    > db.csbn.insert({name:"aa bb cc",age:0})
        WriteResult({
        "nInserted" : 0,
        "writeError" : {
        "code" : 11000,
        "errmsg" : "E11000 duplicate key error collection: first.csbn index: normal_index
        up key: { : \"aa bb cc\", : 0.0 }"
        }
    })

查询语句补充

查询存在某字段的文档:

注释:mongodb中时候不存在表结构的,没有固定的字段。当我们想查找存在某字段的文档时,需要用到“$exists”操作符。当$exists为“true”时,则表示查找存在某字段的值为false时表示不存在查找不存在某字段的文档
语法:db.[collection].find({name:{$exists:true|false}})
例子:查找csbn表中存在“desc”字段的集合
    db.csbn.find({desc:{$exists:true}})

稀疏度

注释:mongodb中时候不存在表结构的,没有固定的字段。当表中存在索引,我们插入文档时,mongodb会默认为这条文档添加索引。但是我们插入的文档可能不存在索引的那个字段。(例如csbn中存在“name”字段的索引,但是当我们使用db.csbn.insert({age:11}),这时mongodb仍会为这个文档创建索引,但是实际上我们并不用为这个文档创建索引。)

语法:db.[collection].ensureIndex({},{sparse:true|false})
例子:为csbn表中的“name”字段创建稀疏索引
db.csbn.ensureIndex({name:1},{sparse:true})

创建索引后,强制使用索引查找不存在name字段的数据(hint()表示强制使用索引,里边的参数为索引名)
db.csbn.find({name:{$exists:true}}).hint("name_1")
这条语句会过滤不存在“name”字段的文档

地理位置索引

创建地理位置索引:

注释:地理位置索引的参数共有两种,一种为“2d”,是基于平面的地理位置;  
    一种为“2dsphere”,是基于球面的地理位置索引。
语法:db.[collection].ensureIndex({"key":"2d"})
例子:在location表中为“place”字段创建地理位置索引
    db.location.ensureIndex({"x":"2d"})


插入数据的语法:地理位置的字段插入的时候为一个数组,表示经纬度
    位置表示方式:经纬度[经度,纬度]
    取值范围:经度[-180,180] 纬度[-90,90]
    例子:db.location.insert({x:["100","80"]})

查找离[1,1]近的点(mongodb默认会查询出离查询的点最近的100个点):
    db.location.find({x:{$near:[1,1]}})
如果想指定返回结果的个数可以使用limit函数:    
    db.location.find({x:{$near:[1,1]}}).limit(5)


查询最远距离内的点(使用$maxDistance限制最远距离为100):
    db.location.find({x:{$near:[1,1],$maxDistance:100}})

查询地理位置索引某个形状内的点:

查询矩形内的点:

    注释:使用{$geoWithin:{$box:[x1,y1],[x2,y2]}}查找矩形内的点.  
        [x1,y1],[x2,y2]表示构成矩形的两个点
    语法:db.[collection].find({"key":{$geoWithin:{$box:[[x1,y1],[x2,y2]]}}})
    例子:查找[1,1][100,100]两点组成的矩形内的点
         db.location.find({x:{$geoWithin:{$box:[[1,1],[100,100]]}}})


查找圆形内的点:

    注释:使用{$geoWithin:{$center:[x1,y1],[r]}查找圆形内的点。  
        [x1,y1]表示圆心,[r]表示半径。
    语法:db.[collection].find({"key":{$geoWithin:{$center:[x1,y1],r}}})
    例子:查找以[1,1]为圆心,100为半径的组成的圆内的点。
         db.location.find({x:{$geoWithin:{$center:[[1,1],100]}}})

2d索引的另一种查询方式:

geoNear查询:
语法:
db,runCommand({
    geoNear:<collection>,
    near:[x,y]
    maxDistance:
    num:
})
注:num表示想要返回的数据的条数

例子:在location表中查询一条离[1,1]点最近的数据,并且限制最远的距离为100。

    db.runCommand({
        geoNear:"location",
        near:[1,1],
        maxDistance:100,
        num:1
    })
返回结果如下图所示:
    results:表示查询到的结果
        dis:表示与[1,1]点的距离
        obj:表示返回的数据
    stats:表示一些系统信息
        nscanned:表示查询了多少条数据
        avgDistance:表示平均距离
        maxDistance:表示最远的那个点的距离
        time:表示查询花费的时间

菜鸟一枚,大神勿喷。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值