您的位置:首页 > 数据库 > Mongodb

MongoDB 游标和索引

2016-07-26 11:08 204 查看

游标

游标是指数据可以一行行的进行操作,非常类似于 ResultSet 数据处理。在 MongoDB 数据库里面,对于游标的控制非常简单,只需要使用 find() 函数就可以返回游标了。

对于返回的游标,若要想进行操作,则使用以下两个函数:

判断是否有下一行数据:hasNest()

取出当前数据:next()

例如:

var cursor = db.students.find();
cursor.hasNext();
cursor.next();


以上是游标的操作形式,但是是实际上不可能这么去用,因为必须利用循环才能够输出内容。

范例:编写具体的操作代码

var cursor = db.students.find();
while(cursor.hasNext()){
var doc = cursor.next();
print(doc.name);
}


相当于每一个数据都单独拿出来进行逐行的控制。当游标数据取出来之后,实际上每行数据返回的都是一个 Object类型的内容,那么如果需要将数据按照 json 的形式出现,则可以使用 printjson() 函数完成。代码如下:

var cursor = db.students.find();
while(cursor.hasNext()){
var doc = cursor.next();
printjson(doc.name);
}


在所有的已知数据库,只有 MongoDB 的游标操作是最简单,最直观的。

索引

在任何的数据库之中,索引都是一种提升数据库检索性能的手段,这一点在 MongoDB 数据库之中同样是存在的。

MongoDB 索引创建分为两种:自动创建和手工创建。

这里写代码片


此时在 students 集合上并没有去设置任何的索引,通过 getIndexes()

范例:查询默认状态下的 students 集合的索引内容

db.students.getIndexes();


若创建自己的索引,语法如下:

索引创建:db.集合名称.ensureIndex({“列”: 1})

设置 1 时,表示索引将按照升序的方式进行排列

设置 -1 时,表示索引将按照降序的方式进行排列。

唯一索引

“唯一索引”主要目的是用在某一个字段上,使该字段的内容不重复。

范例:创建唯一索引

db.students.ensure({"name": 1}, {"unique": true});


过期索引

在一些程序站点会出现若干秒之后,信息被删除的情况。例如:手机信息验证码。在 MongoDB 里面可以轻松实现过期索引,但是这个时间往往不怎么准确(这个特性在进行一些临时数据保存的时候非常有帮助)。

范例:在一个 phones 集合里面设置过期索引

db.phones.ensureIndex({"time": 1}, {"expireAfterSeconds: 10"}) //设置索引在 10 秒后过期


全文索引

在一些信息管理平台上经常需要进行信息模糊查询,最早的时候是利用某个字段上实现的某种查询,但是这个时候返回的信息并不会很准确,因为只能查询 A 字段或是 B 字段,而在 MongoDB 里面实现了非常简单的全文检索。

范例:定义一个新的集合

db.news.insert({"title":"mldn mldnjava lxh gyh", "content": "gyh"})
db.news.insert({"title":"mldn mldnjava lxh", "content": "java"})
db.news.insert({"title":"gyh", "content": "sfq"})
db.news.insert({"title":"gyh", "content": "gry"})
db.news.insert({"title":"sfq", "content": "gry"})


范例:设置全文检索

//待续

$text
” 判断符
用于表示全文检索。

$search
“运算符
用于数据的查询,使用如下:

查询指定关键字:{“$search”: “查询关键字”}

查询多个关键字(即”或“关系):{“$search”: “查询关键字 查询关键字 …”}

查询多个关键字(即”与“关系):{“$search”: “\”查询关键字\” \”查询关键字\” …”}

查询多个关键字(排除某一个):{“$search”: “查询关键字 查询关键字 …-排除关键字”}

范例:查询单个内容

db.news.find({"$text": {"$search": "gry"}});


范例:包含有 “gry” 与 “sfq” 的信息

db.news.find({"$text": {"$search": "gry gyh"}});


范例:同时包含有 “mldn” 与 “lxh” 的内容

db.news.find({"$text": {"$search": "\"mldn\" \"lxh\""}});


范例:包含有 “mldn” 但没有 “gyh” 的内容

db.news.find({"$text": {"$search": "\"mldn\" \"lxh\" -gyh"}})


但是在进行全文检索操作的时候,还可以使用相似度的打分来判断检索成果。

范例:为结果打分

db.news.find({"text": {"$search": "gyh"}}, {"score": {"$meta": "textScore"}})
db.news.find({"text": {"$search": "gyh"}}, {"score": {"$meta": "textScore"}})


按照打分的成绩进行排列,实际上就可以实现更加准确的信息检索。

当字段太多时,可以为所有的字段设置全文检索。

范例:为所有字段设置全文检索

db.news.ensure({"$**": "text"});


地理信息索引

地理信息索引分为两类: 2D平面索引 和 2DSphere球面索引

在2D平面索引里面基本上能够保存的信息都是坐标,而且坐标保存的就是经纬度坐标。

范例:定义一个商铺的集合

db.shop.insert({loc: [10, 10]});
db.shop.insert({loc: [11, 10]});
db.shop.insert({loc: [10, 11]});
db.shop.insert({loc: [12, 15]});
db.shop.insert({loc: [16, 17]});
db.shop.insert({loc: [90, 90]});
db.shop.insert({loc: [120, 130]});


//待续
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  mongodb 索引