一. 游标 在oracle中的游标是查询的结果集,在mongodb中也是一样的。 准备数据(下面用javascript)熟悉plsql开发的话,这里很容易理解,只不过这里用的javascript来开发。 > for(i=0;i<100;i++){
... db.c.insert({x:1});
... } |
1.hasNext()是mongodb游标的方法用来检查是否有后续结果,和oracle中游标属性%FOUND类似.mongodb中游标的next()方法用来获取结果集中的下一个文档。 要遍历100个文档如下所示: > var cursor=db.c.find()
> while(cursor.hasNext()){
... obj=cursor.next();
... } |
2.查询选项limit、skip及sort limit是限制游标返回的数量,指定了上限;skip是忽略前面的部分文档,如果文档总数 量小于忽略的数量,则返回空集合;sort对得到的子集合进行排序,可以按照多个键进行正反排序. > db.c.find().limit(3) 返回3个结果
{ "_id" : ObjectId("53f8b260ef3c1aec16179f18"), "x" : 1 }
{ "_id" : ObjectId("53f8b260ef3c1aec16179f19"), "x" : 1 }
{ "_id" : ObjectId("53f8b260ef3c1aec16179f1a"), "x" : 1 } |
> db.c.find().skip(3) 略过前3个文档 |
> db.c.find().sort({"x":1})排序1代表升序 -1代表降序 |
二. 高级查询 > db.foo.find()
{ "_id" : ObjectId("53f8174def3c1aec16179f16"), "apple" : 1, "banana" : 6, "peach" : 3 }
{ "_id" : ObjectId("53f81783ef3c1aec16179f17"), "apple" : 8, "spinach" : 4, "watermelon" : 4 } |
如下查询: > db.foo.find().sort({"apple" : 1})
{ "_id" : ObjectId("53f8174def3c1aec16179f16"), "apple" : 1, "banana" : 6, "peach" : 3 }
{ "_id" : ObjectId("53f81783ef3c1aec16179f17"), "apple" : 8, "spinach" : 4, "watermelon" : 4 } |
实际上查询是进行了一个包装,为一个大的文档 > db.foo.find({"$query":{},"$orderby":{"apple" : 1}})
{ "_id" : ObjectId("53f8174def3c1aec16179f16"), "apple" : 1, "banana" : 6, "peach" : 3 }
{ "_id" : ObjectId("53f81783ef3c1aec16179f17"), "apple" : 8, "spinach" : 4, "watermelon" : 4 } |
三. 游标内幕(参见mongodb权威指南) 在服务器端,游标消耗cpu,磁盘io,内存等资源。 游标的释放:游标遍历结束、客户端发送终止请求及超时消除(10分钟内不使用游标,该游标被销毁);释放后可以在此被利用,不会存在内存泄露野指针
|