Join us Sept 17 at .local NYC! Use code WEB50 to save 50% on tickets. Learn more >
MongoDB Event
Docs 菜单
Docs 主页
/
数据库手册
/ / /

在 mongosh 中迭代游标 mongosh

本教程演示如何访问权限游标中的文档。

要访问游标中的文档,您可以手动迭代游标或使用 toArray() 方法。

本教程概述了如何:

  • 使用 let 关键字将游标保存为变量。

  • 使用 next()hasNext()forEach() 方法访问权限游标中的文档。

  • 使用 toArray() 方法以大量形式返回并访问权限游标文档。

  • 安装 mongosh。

  • 连接到部署。

使用 mongosh 将文档插入到使用默认test数据库的新集合中:

db.users.insertMany( [
{ _id: 0, type: "admin", email: "admin@example.com", name: "Admin User" },
{ _id: 1, type: "user", email: "user1@example.com", name: "Test User 1" },
{ _id: 2, type: "user", email: "user2@example.com", name: "Test User 2" }
] )

mongosh 中,当您使用 let 关键词将游标赋值给一个变量时,游标不会自动迭代。

let myCursor = db.users.find( { type: "user" } )

您可以在Shell中调用游标变量进行最多迭代 20 次 [1],并打印匹配的文档。

myCursor
[
{
_id: 1,
type: 'user',
email: 'user1@example.com',
name: 'Test User 1'
},
{
_id: 2,
type: 'user',
email: 'user2@example.com',
name: 'Test User 2'
}
]

如果返回的游标未使用 let 关键词赋值给变量,则游标会自动迭代至批处理大小 [1],并打印出第一批结果。

db.users.find( { type: "user" } )
[
{
_id: 1,
type: 'user',
email: 'user1@example.com',
name: 'Test User 1'
},
{
_id: 2,
type: 'user',
email: 'user2@example.com',
name: 'Test User 2'
}
]

还可以使用游标方法 next() 访问权限文档。next() 返回游标当前指向的文档,然后将游标向前移动到下一个文档。

let myCursor = db.users.find( { type: "user" } )
myCursor.next()
{
_id: 1,
type: 'user',
email: 'user1@example.com',
name: 'Test User 1'
}

游标方法 hasNext() 返回 truefalse,以指示游标中是否还有更多文档需要返回。

let myCursor = db.users.find( { type: "user" } )
myCursor.hasNext()
true

您可以使用 hasNext()next() 方法,通过 printjson() 辅助工具打印游标中所有剩余的文档。

let myCursor = db.users.find( { type: "user" } )
while ( myCursor.hasNext() ) {
printjson( myCursor.next() )
}
{
_id: 1,
type: 'user',
email: 'user1@example.com',
name: 'Test User 1'
}
{
_id: 2,
type: 'user',
email: 'user2@example.com',
name: 'Test User 2'
}

同样,您可以使用游标方法 forEach() 将辅助工具(如 printjson())应用于游标中的每个文档。

let myCursor = db.users.find( { type: "user" } )
myCursor.forEach( myDocument => printjson(myDocument) )
{
_id: 1,
type: 'user',
email: 'user1@example.com',
name: 'Test User 1'
}
{
_id: 2,
type: 'user',
email: 'user2@example.com',
name: 'Test User 2'
}

mongosh 2.1.0 开始,您也可以使用 for-of 循环来迭代游标。以下示例返回与上一示例相同的结果。

let myCursor = db.users.find( { type: "user" } )
for ( let myDocument of myCursor ) {
printjson( myDocument )
}
{
_id: 1,
type: 'user',
email: 'user1@example.com',
name: 'Test User 1'
}
{
_id: 2,
type: 'user',
email: 'user2@example.com',
name: 'Test User 2'
}

有关游标方法的更多信息,请参阅 JavaScript 游标方法驱动程序文档。

mongosh 中,使用 toArray() 方法迭代游标并以大量返回文档。

let myCursor = db.users.find( { type: "user" } )
let documentArray = myCursor.toArray()
documentArray
[
{
_id: 1,
type: 'user',
email: 'user1@example.com',
name: 'Test User 1'
},
{
_id: 2,
type: 'user',
email: 'user2@example.com',
name: 'Test User 2'
}
]

您可以将结果文档数组作为传统数组进行访问。

let myCursor = db.users.find( { type: "user" } )
let documentArray = myCursor.toArray()
documentArray[1]
{
_id: 2,
type: 'user',
email: 'user2@example.com',
name: 'Test User 2'
}

toArray() 方法将游标返回的所有文档加载到 RAM 中并耗尽游标。

某些驱动程序使用游标上的索引(即 cursor[index])来提供对文档的访问权。这是对首先调用 toArray() 方法,然后在结果数组上使用索引的更快捷方式。

let myCursor = db.users.find( { type: "user" } )
myCursor.toArray() [1]
{
_id: 2,
type: 'user',
email: 'user2@example.com',
name: 'Test User 2'
}
[1](1, 2) 您可以使用 config.设立(“displayBatchSize”) 以更改文档数量的默认值 20

后退

Cursors

在此页面上