数据库使用游标来返回find的执行结果,客户端对游标的实现通常能够对查询到的结果进行有效的控制,可以限制结果的数量,略过部分结果,根据任意方向,任意键的组合对结果进行排序,或者执行其他一些功能强大的操作。
在shell中使用游标,要先将查询到的结果赋值给一个变量,然后通过游标一次查看一条结果。如果查询结果没有赋值给变量,那么shell会自动迭代,打印所有查询到的结果。游标提供了两个方法,hasNext返回是否还有结果,next返回下一个结果用来遍历查询到的结果,还提供了limit,skip,sort几个方法来操作结果。因为游标对象的方法都返回游标本身,所以这几个方法可以以任意的顺序进行组合。如:
> db.people.find()
{ "_id" : ObjectId("53a3e01d33c516902a43a797"), "name" : "mary", "age" : 20 }
{ "_id" : ObjectId("53a3e02533c516902a43a798"), "name" : "amy", "age" : 23 }
{ "_id" : ObjectId("53a3e02d33c516902a43a799"), "name" : "join", "age" : 18 }
{ "_id" : ObjectId("53a3e03c33c516902a43a79a"), "name" : "jodan", "age" : 25 }
{ "_id" : ObjectId("53a3e04933c516902a43a79b"), "name" : "mical", "age" : 19 }
> var cursor = db.people.find();
> while(cursor.hasNext()){ obj = cursor.next(); print(obj.name); }
mary
amy
join
jodan
mical
> var cursor = db.people.find().limit(3);
> while(cursor.hasNext()){ obj = cursor.next(); print(obj.name); }
mary
amy
join
> var cursor = db.people.find().skip(2);
> while(cursor.hasNext()){ obj = cursor.next(); print(obj.name); }
join
jodan
mical
> var cursor = db.people.find().sort({"name" : 1});
> while(cursor.hasNext()){ obj = cursor.next(); print(obj.name); }
amy
jodan
join
mary
mical
> var cursor = db.people.find().skip(2).limit(2).sort({"name" : 1});
> while(cursor.hasNext()){ obj = cursor.next(); print(obj.name); }
join
mary
limit表示对查询到的结果加上数量上限,如果查询到的结果数量多于这个上限,则返回这个数量的结果,如果不够,就返回全部的结果。skip表示略过一定数量的结果,如果查询到的结果数量少于这个数量,就没有任何文档返回,如果多于,则略过这个数量的文档后再返回。sort表示对查询结果进行排序,指定字段并指定顺序,1为升序,-1为降序,也可以同时对多个字段进行排序。