mongodb基础篇--cursor对象

文章目录

        • limit和skip
        • count()和size()
        • sort()
        • next()和forEach()
        • toArray()
        • map()

Cursor 对象不是查询结果,而是查询返回的 接口。当我们调用 find()/findMany()/findOne() 时,Shell 并不是立即从数据库中取出数据,而是在我们使用时才会取出数据。Cursor 对象有很多方法,例如 close(),hasNext(),next(), isClose() 等。

完整方法及对应描述如下表所示:

名称 描述
cursor.addOption() 添加特殊的线程协议标志,用于修改查询的行为。
cursor.batchSize() 控制 MongoDB 在单个网络消息中返回客户端的文档数。
cursor.close() 关闭游标并释放相关的服务器资源。
cursor.isClosed() true 如果光标关闭则返回。
cursor.collation() 指定由返回的游标的排序规则。
cursor.comment() 在查询中附加注释,以便在日志和 system.profile 集合中实现可跟踪性。
cursor.count() 返回结果集中的文档数。
cursor.explain() 报告游标的查询执行计划。
cursor.forEach() 为游标中的每个文档应用 JavaScript 函数。
cursor.hasNext() 如果游标包含文档并且可以迭代,则返回 true。
cursor.hint() 强制 MongoDB 为查询使用特定索引。
cursor.isExhausted() 检查游标是否处于关闭状态,为 true 代表关闭。
cursor.itcount() 通过获取和迭代结果集来计算游标客户端中的文档总数。
cursor.limit() 约束游标结果集的大小。
cursor.map() 将函数应用于游标中的每个文档,并收集数组中的返回值。
cursor.max() 指定游标的独占上限索引。
cursor.maxScan() 指定要扫描的最大项目数; 收集扫描的文档,索引扫描的键。已过时
cursor.maxTimeMS() 指定处理游标操作的累积时间限制(以毫秒为单位)。
cursor.min() 指定游标的包含性较低索引范围。用于 cursor.hint()
cursor.next() 返回游标中的下一个文档。
cursor.noCursorTimeout() 指示服务器在一段时间不活动后自动关闭光标。
cursor.objsLeftInBatch() 返回当前游标批处理中剩余的文档数。
cursor.pretty() 配置光标以易于阅读的格式显示结果。
cursor.readConcern() 指定读取关注的find()
cursor.readPref() 指定对游标的读取首选项,以控制客户端如何将查询定向到复制集。
cursor.returnKey() 修改游标以返回索引键而不是文档。
cursor.showRecordId() 向光标返回的每个文档添加内部存储引擎ID字段。
cursor.size() 返回应用 skip()
cursor.skip() 返回仅在传递或跳过多个文档后才开始返回结果的游标。
cursor.sort() 返回根据排序规范排序的结果。
cursor.tailable() 将光标标记为 tailable,仅适用于超过上限集合的游标。
cursor.toArray() 返回一个数组,其中包含游标返回的所有文档。

limit和skip

查询时可以使用 limit() 方法指定 Cursor返回的文档数量,这能够有效地提高查询性能。

skip(n)指跳过前n个

db.getCollection('test').find({}).limit(3)
db.getCollection('test').find({}).skip(10).limit(-3)

limit() 可以接受小于 2^31 的正整数和大于 -2^31 的负整数,数字 0 也是有效的。limit() 中的数字取绝对值,也就是说 limit(3) 和 limit(-3) 得到的结果是相同的。limit(0) 等效于 not limit,即未使用 limit()。

count()和size()

count()可以获取文档的总数量
size()也可以获取文档的总数量,但size()的结果会受到limit或skip的影响。

db.getCollection('test').find({}).count()
db.getCollection('test').find({}).size()
// 返回结果一样 都为14
db.getCollection('test').find({}).limit(10).count()
db.getCollection('test').find({}).limit(10).size()

// 返回结果不同。count()为14,size()为10
db.getCollection('test').find({}).skip(10).count()
// 14
db.getCollection('test').find({}).skip(10).size()
// 4

sort()

sort() 的升序用数字 1 ,降序用 -1 表示。

_id降序:

db.getCollection('test').find({}).sort({"_id":-1})

sort() 支持多条件排序,例如

db.getCollection('test').find({}).sort({"name":-1,"price":1})

MongoDB 在比较不同的 BOSN 类型时,将使用以下比较顺序,顺序从低到高:

  • MinKey (internal type)
  • Null
  • Numbers (ints, longs, doubles, decimals)
  • Symbol, String
  • Object
  • Array
  • BinData
  • ObjectId
  • Boolean
  • Date
  • Timestamp
  • Regular Expression
  • MaxKey (internal type)

next()和forEach()

使用find()查询时默认返回一定量的数据,比如Robo3T是50个。如果想获得更多的文档可以使用next()方法或者forEach()。

var cursor = db.getCollection('test').find({});
while(cursor.hasNext()){
    printjson(cursor.next())
}

hasNext()用于检查是否还存在下一个文档。next()是获取下一个文档。

forEach() 的语法如下:

db.collection.find().forEach()

打印所有数据

var cursor = db.getCollection('test').find({});
cursor.forEach(printjson)

或者获取某个字段值:

var cursor = db.getCollection('test').find({});
cursor.forEach(function(item){
    printjson(item._id)
})

toArray()

还可以使用toArray()方法迭代Cursor对象。toArray()会将文档装载到数组中,然后可以使用下标访问文档。

var cursor = db.getCollection('test').find({});
cursor.toArray()[3]

map()

map()的作用和forEach()类似。不同的是map()会将函数返回值装载到数组中。如果map()中的function没有return,那么数组中得到的将是undeffined。

var cursor = db.getCollection('test').find({});
cursor.map(function(item){
    return item._id
})

你可能感兴趣的:(mongodb)