2015-04-04 56 views
0

这是来自here的问题的延续。我的目标是以最低分数更新所有文档。TypeError:无法调用未定义node.js的方法'each'

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的异步行为,但我该如何纠正它。我如何使它同步。
谢谢

回答

0

collection.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}}}); 
      });  
     } 


    } 
); 
}); 

更新:只要阅读文档和骨料()不返回游标(除非它是2.6或更高版本,可以指定选项返回游标): http://mongodb.github.io/node-mongodb-native/api-generated/collection.html

+1

看看[这里](http://stackoverflow.com/questions/23955533/what-聚合游标方法是由nodejs-drivers支持的) – 2015-04-05 01:16:59

+0

它看起来像你可以在2.6+上获得游标。我们有openshift上的所有节点服务器和openshift是使用mongodb 2.4,所以我不知道...感谢链接萨拉斯... – Ben 2015-04-05 05:11:47

+0

我使用2.6.9我cursor.on功能正在为我工​​作,但正常的方法来更新数据将无法正常工作,我猜。我需要如何更新..我无法找到:( – 2015-04-05 10:56:53

相关问题