在NodeJS和MongoDB中未定义toArray

And*_*ier 6 mongodb node.js


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

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

然后我得到了预期的输出.
但是,当我使用以下小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();

});
Run Code Online (Sandbox Code Playgroud)

然后我收到错误消息:'TypeError:无法读取属性'toArray'of undefined'

有人可以帮帮我吗?

非常感谢Andi

chr*_*dam 3

正如 @ExplosionPills 正确指出的那样,您的代码将无法工作,因为日志记录是异步完成的并且在连接关闭后,因此您可以尝试删除该db.close()行或创建一个使用回调函数返回聚合结果的函数:

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

调用aggregateStates函数:

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