TypeError:无法调用未定义node.js的方法'each'
问题描述:
这是来自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的异步行为,但我该如何纠正它。我如何使它同步。
谢谢
答
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
看看[这里](http://*.com/questions/23955533/what-聚合游标方法是由nodejs-drivers支持的) – 2015-04-05 01:16:59
它看起来像你可以在2.6+上获得游标。我们有openshift上的所有节点服务器和openshift是使用mongodb 2.4,所以我不知道...感谢链接萨拉斯... – Ben 2015-04-05 05:11:47
我使用2.6.9我cursor.on功能正在为我工作,但正常的方法来更新数据将无法正常工作,我猜。我需要如何更新..我无法找到:( – 2015-04-05 10:56:53