toArray在NodeJS和MongoDB中未定义

我正在尝试运行一个聚合MongoDB和Nodejs,但是我在运行该项目时遇到了一些困难。 当我在MongoDB shell中input以下命令时:

db.data.aggregate([{$match: {}},{$group: {'_id': '$State', 'total': {'$sum': 1}} }]).toArray() 

那么我正在获得预期的产出。
但是,当我使用下面的小的Nodejs程序

 var MongoClient = require('mongodb').MongoClient; MongoClient.connect('mongodb://localhost:27017/weather', function(err, db) { if(err) throw err; console.log("Connected correctly to server"); var col=db.collection('data'); col.aggregate([{$match: {}},{$group: {'_id': '$State', 'total': {'$sum': 1}} }]) .toArray(function(err, result) { if(err) throw err; console.log(result); }); db.close(); }); 

那么我得到错误消息:'TypeError:无法读取属性未定义的'toArray'

有人可以帮我吗?

非常感谢,安迪

正如@ExplosionPills正确指出的,你的代码不会工作,因为日志logging是asynchronous完成的,并且在连接closures之后,你可以尝试删除db.close()行或者创build一个使用callback函数返回的函数聚合结果:

 var aggregateStates = function(db, callback) { db.collection('data').aggregate( [ { $group: { "_id": "$State", "total": { $sum: 1 } } } ] ).toArray(function(err, result) { console.log(result); callback(result); }); }; 

调用aggregateStates函数:

 var MongoClient = require('mongodb').MongoClient; MongoClient.connect('mongodb://localhost:27017/weather', function(err, db) { aggregateStates(db, function() { db.close(); }); }); 

根据mongo-native driver doc ,aggregate()返回null。 因此,toArray()不能从它返回的内容中调用。 但是,如果成功,aggregate()会接受一个具有aggregate()结果的callback。 所以这是修改后的代码:

 var MongoClient = require('mongodb').MongoClient; MongoClient.connect('mongodb://localhost:27017/weather', function(err, db) { if(err) throw err; console.log("Connected correctly to server"); var col=db.collection('data'); col.aggregate([ {$match: {}}, {$group: {'_id': '$State', 'total': {'$sum': 1}} } ], function(err, result) { if(err) { db.close(); throw err; } console.log(result); db.close(); }); });