如何在nodejs mongodb中使用聚合之后更新数据

您好im新到nodejs和mongodb执行我的聚合命令后,我想要做的是放下聚合命令find的最低分数。这是我的代码:

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 } ] } 

我想放弃第一个得分最低但不能得分的元素

你的函数updateStudents设置了一个closures连接的callback函数。 return db.close();

所以很显然,如果一个更新完成,并在您进行所有更新之前调用callback,您有这个MongoError: Connection Closed By Application错误。

在node.js应用程序中请求之后,您不应该closures连接。 您应该始终使用相同的连接,将其通过应用程序传递给所有需要它的模块。

要从数组中删除值,你不应该使用$ unset来删除整个字段。 你应该使用: var operator = {'$pull' : {'scores' : {'score' : score} } }; 这将从数组分数中删除值分数。