MongoDB 游标和索引

游标

游标是指数据可以一行行的进行操作,非常类似于 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)