在NodeJS和MongoDB中未定义toArray

时间:2015-09-11 19:55:34

标签: node.js mongodb


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

 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'未定义'

有人可以帮助我吗?

非常感谢Andi

2 个答案:

答案 0 :(得分:2)

正如@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);
   });
};

调用aggregateStates函数:

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

答案 1 :(得分:1)

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

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();
    });

});