TypeError:无法调用未定义node.js的方法'each'

时间:2015-04-04 23:25:00

标签: node.js mongodb

这是here的问题的延续。我的目标是以最低分数更新所有文件。

var MongoClient=require('mongodb').MongoClient;
var server=require('mongodb').Server;

var mongoclient=new MongoClient(new server("localhost",27017));

mongoclient.connect("mongodb://localhost:27017/school",function(err,db){

var db=mongoclient.db('school');
cursor=db.collection('students').aggregate(
[
  {$match : {"scores.type" : "homework"}},
  {$unwind:"$scores"},
  {$group : {_id : '$name','minimum' : { $min :"$scores.score"  }}}
], function(err, result) {   // callback
        console.dir(result);
    }
);
cursor.each(function(err,doc)
{
db.collection('students').update({'_id':doc._id},{$pull:{'scores':{'score':doc.minimum}}});
});
});

使用这个我收到错误

node app.js 
undefined

/home/oroborus/node_modules/mongodb/lib/mongodb/mongo_client.js:475
          throw err
                ^

TypeError: Cannot call method 'each' of undefined
        at /home/oroborus/hw3-1/app.js:18:8
        at /home/oroborus/node_modules/mongodb/lib/mongodb/mongo_client.js:83:5
        at /home/oroborus/node_modules/mongodb/lib/mongodb/mongo_client.js:472:11
        at process._tickCallback (node.js:415:13)

根据我之前编写的程序和上面的帖子,这看起来是正确的,为什么这个错误仍然存​​在?
[编辑]
当我做console.dir(游标)时,它表示未定义。为什么?这可能是因为Node.js的异步行为,但我如何纠正它。我如何使它同步。
谢谢

1 个答案:

答案 0 :(得分:0)

collection.aggregate()是异步的,聚合不会返回光标,直到它完成,这是在它的回调中。我不认为aggregate()实际上会返回一个游标。结果应该是'结果'回调,但如果确实如此,如果你需要迭代它,代码应该在它的回调中:

var MongoClient=require('mongodb').MongoClient;
var server=require('mongodb').Server;

var mongoclient=new MongoClient(new server("localhost",27017));

mongoclient.connect("mongodb://localhost:27017/school",function(err,db){
  cursor=db.collection('students').aggregate(
    [
        {$match : {"scores.type" : "homework"}},
        {$unwind:"$scores"},
        {$group : {_id : '$name','minimum' : { $min :"$scores.score"  }}}
    ], function(err, result) {   // callback
        console.dir(result);

        if (cursor) {
            cursor.each(function(err,doc)
            {
                db.collection('students').update({'_id':doc._id},{$pull:{'scores':{'score':doc.minimum}}});
            });     
        }


    }
  );
});

更新:只需阅读文档并且aggregate()不会返回游标(除非它的2.6或更高版本,可以指定选项来返回游标): http://mongodb.github.io/node-mongodb-native/api-generated/collection.html