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