Mongodb-mongodb CRUD Operations, Query Documents, iterate a Cursor in the MONGO Shell

Source: Internet
Author: User
Tags mongodb server tojson mongo shell



TheDb.collection.find ()method returns a cursor. To access the documents, you need to iterate the cursor. However, in theMONGOShell, if the returned cursor was not assigned to a variable using thevarkeyword, Then the cursor was automatically iterated up-to-the-print up-to-the-first documents in the results.



The following examples describe ways to manually iterate the cursor to access the documents or to use the iterator index.





Manually iterate the Cursor


In theMONGOshell, when you assign the cursor returned from thefind ()method to a variable using the C2>var keyword, the cursor does not automatically iterate.



You can call the cursor variable in the shell to iterate up to the times and print the matching documents, as in the follow ing example:


> var myCursor = db.users.find( { type: 2 } );

> myCursor

{ "_id" : 3, "name" : "ahn", "age" : 22, "type" : 2, "status" : "A", "favorites" : { "artist" : "Cassatt", "food" : "cake" }, "finished" : [ 6 ], "badges" : [ "blue", "red" ], "points" : [ { "points" : 81, "bonus" : 8 }, { "points" : 55, "bonus" : 20 } ] }

{ "_id" : 4, "name" : "xi", "age" : 34, "type" : 2, "status" : "D", "favorites" : { "artist" : "Chagall", "food" : "chocolate" }, "finished" : [ 5, 11 ], "badges" : [ "red", "black" ], "points" : [ { "points" : 53, "bonus" : 15 }, { "points" : 51, "bonus" : 15 } ] }

{ "_id" : 5, "name" : "xyz", "age" : 23, "type" : 2, "status" : "D", "favorites" : { "artist" : "Noguchi", "food" : "nougat" }, "finished" : [ 14, 6 ], "badges" : [ "orange" ], "points" : [ { "points" : 71, "bonus" : 20 } ] }

You can also use the cursor method next() to access the documents, as in the following example:


var myCursor = db.users.find( { type: 2 } );


while (myCursor.hasNext()) {

  print(tojson(myCursor.next()));

}

As an alternative print operation, consider the printjson() helper method to replace print(tojson()):


var myCursor = db.users.find( { type: 2 } );


while (myCursor.hasNext()) {

  printjson(myCursor.next());

}

You can use the cursor method forEach() to iterate the cursor and access the documents, as in the following example:


var myCursor =  db.users.find( { type: 2 } );


myCursor.forEach(printjson);

See JavaScript cursor methods and your driver documentation for more information on cursor methods.




Iterator Index

In the mongo shell, you can use the toArray() method to iterate the cursor and return the documents in an array, as in the following:


var myCursor = db.inventory.find( { type: 2 } );

var documentArray = myCursor.toArray();

var myDocument = documentArray[3];

The toArray() method loads into RAM all documents returned by the cursor; the toArray() method exhausts the cursor.


Additionally, some drivers provide access to the documents by using an index on the cursor (i.e.cursor[index]). This is a shortcut for first calling the toArray() method and then using an index on the resulting array.


Consider the following example:


var myCursor = db.users.find( { type: 2 } );

var myDocument = myCursor[1];

The myCursor[1] is equivalent to the following example:


myCursor.toArray()[1];



Cursor Behaviors Closure of Inactive Cursors

By default, the server will automatically close the cursor after 10 minutes of inactivity, or if client has exhausted the cursor. To override this behavior in the mongo shell, you can use the cursor.noCursorTimeout() method:


var myCursor = db.users.find().noCursorTimeout();

After setting the noCursorTimeout option, you must either close the cursor manually with cursor.close() or by exhausting the cursor’s results.


See your driver documentation for information on setting the noCursorTimeout option.


Cursor Isolation

As a cursor returns documents, other operations may interleave with the query. For the MMAPv1 storage engine, intervening write operations on a document may result in a cursor that returns a document more than once if that document has changed. To handle this situation, see the information on snapshot mode.


Cursor Batches

The MongoDB server returns the query results in batches. Batch size will not exceed the maximum BSON document size. For most queries, the first batch returns 101 documents or just enough documents to exceed 1 megabyte. Subsequent batch size is 4 megabytes. To override the default size of the batch, see batchSize() and limit().


For queries that include a sort operation without an index, the server must load all the documents in memory to perform the sort before returning any results.


As you iterate through the cursor and reach the end of the returned batch, if there are more results, cursor.next() will perform a getmore operation to retrieve the next batch. To see how many documents remain in the batch as you iterate the cursor, you can use the objsLeftInBatch() method, as in the following example:


var myCursor = db.inventory.find();


var myFirstDocument = myCursor.hasNext() ? myCursor.next() : null;


myCursor.objsLeftInBatch();



Cursor Information

The db.serverStatus() method returns a document that includes a metrics field. The metrics field contains a metrics.cursor field with the following information:


number of timed out cursors since the last server restart

number of open cursors with the option DBQuery.Option.noTimeout set to prevent timeout after a period of inactivity

number of “pinned” open cursors

total number of open cursors

Consider the following example which calls the db.serverStatus() method and accesses the metricsfield from the results and then the cursor field from the metrics field:


db.serverStatus().metrics.cursor

The result is the following document:


{

  "timedOut" : <number>

  "open" : {

     "noTimeout" : <number>,

     "pinned" : <number>,

     "total" : <number>

  }

}

SEE ALSO: db.serverStatus()


MongoDB - MongoDB CRUD Operations, Query Documents, Iterate a Cursor in the mongo Shell



Related Article

Contact Us

The content source of this page is from Internet, which doesn't represent Alibaba Cloud's opinion; products and services mentioned on that page don't have any relationship with Alibaba Cloud. If the content of the page makes you feel confusing, please write us an email, we will handle the problem within 5 days after receiving your email.

If you find any instances of plagiarism from the community, please send an email to: info-contact@alibabacloud.com and provide relevant evidence. A staff member will contact you within 5 working days.

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.