2015-04-04 2 views
0

Это вопрос с вопросом here. Моя цель - обновить все документы с минимальным счетом.TypeError: Невозможно вызвать метод «каждый» неопределенного узла.js

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 (курсор), он сказал undefined. Зачем ? Это может быть связано с асинхронным поведением Node.js, но как его исправить. Как сделать его синхронным.

ответ

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


    } 
); 
}); 

Update: Просто прочитайте этот документ и совокупность() не возвращает курсор (если он не равен 2.6 или больше, опция может быть указана для возврата курсора): http://mongodb.github.io/node-mongodb-native/api-generated/collection.html

+1

посмотреть [здесь] (http://stackoverflow.com/questions/23955533/what- aggregation-cursor-methods-are-supported-by-nodejs-drivers) –

+0

похоже, что вы можете получить курсор на 2.6+. у нас есть все сервер узла на openshift и openshift использует mongodb 2.4, поэтому я не знал об этом ... Спасибо за ссылку Saras ... – Ben

+0

Я использую 2.6.9 i функция cursor.on работает для меня, но нормальный метод обновления данных не будет работать. Мне нужно, как обновить .. Я не могу найти это :( –