cursor指向查询结果的游标,通过游标向下移动,获得下一条查询结果。当查询效率高,获取查询结果仅仅需要少量的资源时,cursor返回结果的速度快。而查询速度慢,占用cpu,内存等资源多,cursor返回结果的速度慢。就像使用网络观看视频一样,视频在一秒一秒的播放,加载流畅时,观众就可以安心舒适的观看。而加载缓慢时,观众可能选择切换视频资源。关闭当前观看视频的这个操作,就类似mongodb数据库killCusors.
killCursors功能
停止指定的游标或某个集合的游标。
各种Mongodb连接工具,基于killCursors命令,实现游标的部分操作。应用程序中,通常应用不会直接调用killCursors命令,而是数据库管理或开发人员,通过应用系统响应速度,或者观察数据库的监控结果,获得长时间或占用资源多的cursor,来运行killCurors命令,停止掉对数据库性能产生影响或长时间运行的cursor。
为了减少影响,降低风险,执行killCursors命令必须在当前集合所在的数据库中执行。
语法
db.runCommand({ killCursors: <collection>, cursors: [<cursor id1>, ...], comment: <any>
})
其中,使用killCursors指定本次操作针对的集合名称。 字段cursors包含cursor id数组。comment是可选字段,用户对本次操作的一些备注和说明。可以是BSON类型中的任何一种数据类型。添加备注说明时,可以在下面的三个位置查看
- Mongodb日志中,attr.command.cursor.comment字段
- Database profile输出的command.comment字段
- currentOp输出的command.comment字段
用户权限
使用killCursors时,用户需要拥有相应的权限。
停止当前用户创建的游标
- 4.2及以后得版本,当前用户有权限停止自己创建的游标。当用户使用查询语句创建游标时,游标即与当前用户建立关联关系
- 4.0及以前版本,用户需要有killCursors权限,才能停掉自己创建的游标。同样,与4.2版本想用,用户使用查询语句创建游标时,游标即与当前用户建立关联关系。
停止其他用户创建的游标
用户需要有killAnyCursor权限
应用举例
- 创建游标
use testdb.runCommand({find: "resturants",filter: {stars: 5},projection: {name:1, rating: 1,address:1},sort: { name: 1},batchSize: 5
}) //返回
{"waitedMS" : NumberLong(0), "cursor" : { "firstBatch" : [{ "_id" : ObjectId("57506d63f578028074723dfd"), "name" : "Cakes and more" },{"_id" : ObjectId("57506d63f578028074723e0b"),"name" : "Pies and things"},{"_id" : ObjectId("57506d63f578028074723e1d"),"name" : "Ice Cream Parlour"},{"_id" : ObjectId("57506d63f578028074723e65"),"name" : "Cream Puffs"},{"_id" : ObjectId("57506d63f578028074723e66"),"name" : "Cakes and Rolls"}],"id" : NumberLong("18314637080"),"ns" : "test.restaurants"}, "ok" : 1
}
- 使用killCursors停止游标
use test
db.runCommand({ killCusors: "restaurants", cusors: [NumberLong("18314637080")]
})