问题
As you know from 2.6 on Mongodb aggregate()
operation returns a cursor, however the behavior is a bit different than the normal cursor which returns from a find()
. I am using native mongodb nodejs driver, and could not find a proper documentation on available aggregate cursor methods.
For example, one cannot run a count()
on an aggregation cursor however there are two methods such cursor.objsLeftInBatch()
and cursor.itcount()
n mongo shell. I could not find any of them in the source code of nodejs native driver. What aggregation cursor methods are supported by Nodejs native driver or Mongoose?
回答1:
What actually gets returned from aggregate with a cursor is a node transform stream interface with a few other convenience methods, notably:
explain: [Function],
get: [Function],
getOne: [Function],
each: [Function],
next: [Function],
Which you can obtain by simply dumping the cursor object using console.log
. Those should be self explanatory with the get()
method being equivalent to .toArray()
.
Since this is a standard streaming interface the methods and event handlers are available as per this interface, so with an example:
var MongoClient = require('mongodb').MongoClient;
MongoClient.connect("mongodb://localhost/test", function(err,db) {
var items = [];
var counter = 0;
var cursor = db.collection('tags').aggregate(
[
{ "$project": {
"t1": 1,
"t2": 1
}}
],
{ "cursor": { "batchSize": 25 } }
);
console.log( cursor );
cursor.on('data', function(data) {
console.log( this ); // dump the current state info
items.push( data );
counter++;
});
cursor.on('end', function() {
console.log( "Iterated " + counter + " times" );
});
});
The "data" event is fired with each cursor iteration and properties on the object will show whether the stream is complete or still iterating and so on.
来源:https://stackoverflow.com/questions/23955533/what-aggregation-cursor-methods-are-supported-by-nodejs-drivers