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