在NoSQL数据库中游标的概念与关系型数据库差不多,主要是为了达到延长执行的效果。客户端通过对游标进行一些设置就能对查询结果进行有效地控制,如可以限制查询得到的结果数量、跳过部分结果、或对结果集按任意键进行排序等!
直接对一个集合调用find()方法时,我们会发现,如果查询结果超过二十条,只要返回二十条的结果,这是因为Mongodb会自动递归find() 返回的游标。
/** find() 查找所有的,num 集合中有150数据 */
db.num.find()
输入“it” 后会显示后二十条的数据。
一、游标的基本操作
当我们使用一个变量来保存 find()的返回值时,其将不会自动进行遍历显示查询结果的操作,这时候相当于hibernate中的懒加载的形式,并没有真正的去查询数据库,只要当用到的时候(也就是遍历游标的时候)才会到数据库中将数据取出来:
/** 使用变量来保存查询结果 */
var cursor = db.num.find()
我们需要自己对这个查询结果的游标进行遍历:
/** 遍历刚才的游标 */
cursor.forEach(function(x){print(x.var)})
总共会显示150条结果。
二、游标中的 limit,skip,sort
当获得游标后,我们可以先对游标进行处理后,再让访问数据库的动作按照我们的意愿发生。在这里我们可以使用limit,skip,sort三个函数来处理游标。同时这三个函数可以组成方法链式调用的形式。
limit:限制游标返回的数量,指定了上限
skip:忽略前面的部分文档,如果文档总数量小于忽略的数量,则返回空集合
sort:得到的子集合进行排序,可以按照多个键进行正反排序!
/** 查询5条 */
var cursor = db.num.find().limit(5)
cursor.forEach(function(x){print(x.var)})
/** 查询5条 并按照 var 降序排列 */
var cursor = db.num.find().limit(5).sort({"var":-1})
cursor.forEach(function(x){print(x.var)})
/** 查询10条 并按照 var 降序排列 且忽略前五行 */
var cursor = db.num.find().limit(5).sort({"var":-1}).skip(3)
cursor.forEach(function(x){print(x.var)})
在这里需要注意一点的就是,sort这个函数。当键 “var”的值是 小于0 的数字时,那么就按照该键的降序排列;当键 “var" 的值是 大于0 的数字时,那么就按照该键的升序排列。
三、相同键不同类型的值的比较顺序
mongoDB有一个关于各种数据类型之间比较的等级制度。在某些情况下,你可能有一个key,它的值有多种类型,如果你想按照该key排序,mongoDB有一个预定义好的顺序,它们从小到大分别为:
1. Minimum value
2. null
3. Numbers (integers, longs, doubles)
4. Strings
5. Object/document(对象/文档)
6. Array
7. Binary data
8. Object ID(对象id)
9. Boolean10. Date
11. Timestamp(时间戳)
12. Regular expression(正则表达式)
13. Maximum value