游标是指数据可以一行行的进行操作,非常类似于 ResultSet 数据处理。在 MongoDB 数据库里面,对于游标的控制非常简单,只需要使用 find() 函数就可以返回游标了。
对于返回的游标,若要想进行操作,则使用以下两个函数:
例如:
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.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
“运算符用于数据的查询,使用如下:
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]});
//待续