我正在尝试运行聚合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
答案 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();
});
});