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

时间:2014-02-01 15:31:07

标签: node.js mongodb

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

我想放弃得分最低但不能

的第一个元素

1 个答案:

答案 0 :(得分:2)

您的函数updateStudents设置了一个关闭连接return db.close();

的回调

很明显,如果一次更新完成并在完成所有更新之前调用回调,则会出现MongoError: Connection Closed By Application错误。

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

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