📜  MongoDB 游标

📅  最后修改于: 2022-05-13 01:56:58.397000             🧑  作者: Mango

MongoDB 游标

在 MongoDB 中,当 find() 方法用于查找给定集合中存在的文档时,该方法返回一个指针,该指针将指向集合的文档,现在该指针称为游标。或者换句话说,我们可以说游标是一个指针,使用这个指针我们可以访问文档。默认情况下,游标自动迭代,但您可以手动迭代游标,我们将在后面讨论。

示例:在本示例中,我们正在使用:

在这里,我们使用以下查询来显示学生集合中存在的所有文档

db.student.find().pretty()

这个 find() 方法返回一个游标,其中包含学生集合中存在的所有文档。

手动迭代游标

在 MongoDB 中, find() 方法返回游标,现在要访问我们需要迭代游标的文档。在 mongo shell 中,如果游标未分配给 var 关键字,则 mongo shell 会自动将游标迭代到 20 个文档。 MongoDB 还允许您手动迭代游标。因此,要手动迭代游标,只需将 find() 方法返回的游标分配给 var 关键字或 JavaScript 变量。

注意:如果游标在 10 分钟内处于非活动状态,那么 MongoDB 服务器将自动关闭该游标。

句法:

例子 :

var mycursor = db.student.find({studentId:3}).pretty()
mycursor

在这里,我们手动迭代游标以找到 studentId 为 3 的文档。因此,我们将 find() 方法返回的游标分配给 JavaScript 变量(即 mycursor)。

使用 next() 方法:

我们还可以使用 next() 游标方法来访问下一个文档。让我们借助一个例子来讨论:

例子:

var mycursor = db.student.find({studentId:{$gt:1}});
> while(mycursor.hasNext()){
... print(tojson(mycursor.next()));
... }

在这个例子中,studentId 2 和 3 文档显示,因为在第一行我们专门将光标放在 studentId > 1 开始。所以它跳过了第一个文档并检索剩余的文档。这里使用了 print(tojson()) 方法来显示结果。您还可以使用 printjson() 方法来显示结果。

使用 forEach() 方法:

我们还可以使用 forEach() 方法来迭代游标。此函数适用的JavaScript函数从光标每个文档。



句法:

例子:

var mycursor = db.student.find({studentId:3}).pretty()
mycursor.forEach(printjson)

在这里,首先我们将 find() 方法返回的游标(即 studentId:3)存储在 mycursor 变量中。现在,我们使用 forEach() 方法迭代游标并使用 printjson 显示结果文档。

迭代器索引:

在 mongo shell 中,您可以迭代游标并使用 toArray() 方法在数组中显示结果文档。

句法:

例子:

var mycursor = db.student.find().pretty()
var docs = mycursor.toArray()
var resultdoc = docs[0]
resultdoc

在这里,首先我们将返回的游标分配给 var 关键字(即 mycursor),接下来我们使用 toArray() 方法从结果光标创建一个数组,并将结果分配给 var 关键字(即 docs)。现在我们根据它们的索引访问文档,例如 var resultdoc = docs[0],这里我们显示一个索引为 0 的文档。

替代方法:

您也可以使用此方法使用光标上的索引访问文档。

var mycursor = db.student.find().pretty()
var resultdoc = mycursor[0]
resultdoc

常用方法

下面是常用的游标方法:

计数光标:

为了获得正确的文档,我们需要知道该集合有多少文档。为此,我们可以使用 count() 方法,该方法返回给定集合中存在的文档总数。

句法:

例子:

db.student.find().count()

在这里,我们使用 count() 方法找到学生集合中存在的文档总数。

光标限制:

limit() 方法有助于从集合中获取有限的记录。假设我们有多个文档,但我们想要最顶层或只有 2 个文档,那么通过使用 limit() 方法,我们可以实现这一点。

句法:

例子:

db.student.find().limit(2).pretty()

在这里,我们只显示学生集合中的前两个文档。

光标大小:

在应用任何 cursor.skip() 和 cursor.limit() 方法后, cursor.size() 方法将有助于返回作为 db.collection.find() 查询输出的文档数量的计数。基本上,它将过滤给定的条件并找到光标的大小。因此,提到它是因为它应用了 cursor.skip() 和 cursor.limit() 方法。

句法:

例子:

db.student.find({studentId:1}).size()

光标排序:

通常在验证文档时,如果输出是按升序或降序排序的,会更容易。所以我们使用 sort() 方法对文档进行排序。如果要按升序对文档进行排序,然后将字段的值设置为 1,然后按降序设置,然后设置为 -1。



句法:

例子:

db.student.find().sort({studentId:-1}).pretty()

在这里,我们按降序对学生集合中存在的所有文档进行排序。

Cursor.toArray():

为了有一个包含游标返回的所有文档的数组,我们可以使用 toArray() 方法。

句法:

例子:

db.student.find().toArray()

Cursor.next:

next() 方法用于返回游标中的下一个文档。通常,它会返回第一个文档,因为这将是游标中第一个文档的结果。

句法:

例子:

db.student.find().next()

在这里,next() 方法返回集合中的第一个文档。

光标方法

游标方法修改了底层查询的执行方式。

Method NameDescription
cursor.addOption()This method is used to adds special wire protocol flags and modifies the behavior of the query. 
cursor.allowDiskUse()This method allows MongoDB to use temporary files on disk to store data exceeding the 100-megabyte system memory limit while processing a blocking sort operation.
cursor.allowPartialResults()This method allows find() operation against a collection to return partial results, rather than an error if one or more queried shards are unavailable.
cursor.batchSize() This method is used to control the number of documents MongoDB will return to the client in a single network message.
cursor.close()This method is used to close a cursor and free associated server resources. 
cursor.isClosed()This method is used to return true if the cursor is closed.  
cursor.collation()This method is used to specify the collation for the cursor that is returned by the find() method.
cursor.comment()This method is used to attaches a comment to the query to allow for traceability in the logs and the system.profile collection.
cursor.explain()This method is used to report on the query execution plan for a cursor.
cursor.forEach()This function is used to apply a JavaScript function for every document present in the cursor.
cursor.hasNext()This method returns true if the cursor has more documents and can be iterated.
cursor.hint()This method forces MongoDB to use a specific index for a query.
cursor.isExhausted()When the cursor is closed and there are no objects remaining in the batch, this method returns true
cursor.itcount()cursor.count() and itcount() are both similar only. In itcount(), execution on an existing iterator, exhausting its contents in the process.
cursor.map()Output is available in an array by applying a function to each document in a cursor.
cursor.max()This method is used to specify exclusive upper index bound for cursor.
cursor.maxTimeMS()This method is used to specify the cumulative time limit in cumulative time limit in milliseconds for operations on a cursor.
cursor.min()This method is used to specify inclusive lower index bound for a cursor.
cursor.next()This method is used to retrieve the next document in a cursor.
cursor.noCursorTimeout()This method instructs the server to avoid closing a cursor automatically after a period of inactivity.
cursor.objsLeftInBatch()This method is used to find the number of documents left in the current cursor batch.
cursor.pretty()This method is used to display the results in an easy-to-read manner.
cursor.readConcern()A read concern is specified for a find() operation.
cursor.readPref()This method specified a read preference to a cursor to control how the client directs queries to a replica set.
cursor.returnKey()Usually, find() operation resultant cursor provides documents whereas returnkey() modifies the cursor and it returns index keys
cursor.showRecordId()This method adds an internal storage engine ID field which is returned by the cursor.
cursor.skip()During the display of documents, we may require to skip few documents due to various reasons. During that time, skip() helps to display results after skipping a number of documents.
cursor.tailable()The method marked as tailable with the cursors of capped collections.