2014-02-01 2 views
1

Привет, я новичок в nodejs и mongodb Что я хочу сделать после выполнения моей агрегированной команды, это отбросить самый низкий результат, найденный командой агрегата. Это мой код :Как обновить данные после использования aggregate в nodejs mongodb

MongoClient.connect('mongodb://localhost:27017/school', function(err, db) { 
    if(err) throw err; 

    var students = db.collection("students"); 

    students.aggregate([ { "$unwind": "$scores" }, 
    {"$group": { '_id':'$_id' , 'score': {'$min': "$scores.score" } } }],function(err, result){ 
      if(err) throw err; 
      for(var i=0; i<200; i++){ 
       //console.log(result[i].score); 
       updateStudents(result[i]._id,result[i].score); 
      } 
    }); 


    function updateStudents(_id,score){ 
     var query = {'_id':_id}; 
     var operator = {'$unset' : {'scores.score' : score}}; 
     var options = {multi : true}; 

     students.update(query,operator,options,function(err,updated){ 
      if(err) throw err; 
      console.dir('Successfully Updated' + updated); 
     }); 
    } 

}); 

В нем говорится, что он обновлен успешно, но когда я проверяю его по запросу, он не снизил самый низкий балл пользователей.

это то, что схема выглядит следующим образом:

db.students.find({'_id':0}).pretty() 
{ 
    "_id" : 0, 
    "name" : "aimee Zank", 
    "scores" : [ 
     { 
      "type" : "exam", 
      "score" : 1.463179736705023 
     }, 
     { 
      "type" : "quiz", 
      "score" : 11.78273309957772 
     }, 
     { 
      "type" : "homework", 
      "score" : 6.676176060654615 
     }, 
     { 
      "type" : "homework", 
      "score" : 35.8740349954354 
     } 
    ] 
} 

Я хотел бросить первый элемент, который имеет самый низкий балл, но косяк

+0

обновленный мой ответ – Guilro

ответ

2

Ваша функция updateStudents настроить функцию обратного вызова, замыкающее соединение return db.close();

Таким образом, очевидно, что если одно обновление завершится и вызовет обратный вызов, прежде чем вы сделаете все обновления, у вас есть эта ошибка MongoError: Connection Closed By Application.

Не следует закрывать соединение после запроса в приложении node.js. Вы должны использовать всегда одно и то же соединение, передавая его через ваше приложение ко всем модулям, которым это необходимо.

Чтобы удалить значение из массива, вы не должны использовать $ unset, который используется для удаления целых полей. Вы должны использовать: var operator = {'$pull' : {'scores' : {'score' : score} } };, который удалит оценку стоимости из массива.

+0

привет, спасибо за ответ. Я обновил свой вопрос, ошибка исчезла, но, похоже, мое обновление все еще не работает должным образом. Он говорит, что он обновился, но когда я проверил db по запросу, он не запустил ни один из показателей, который имеет самый низкий балл для пользователей. почему это? –

+0

С моим последним правлением? – Guilro

+0

это сработало! благодаря! –

Смежные вопросы