mongo如何更新文档

时间:2015-11-16 07:08:33

标签: node.js mongodb mongodb-query nosql

从名为user的集合中给出以下模式:

{
    "email": "somebody@gmail.com", 
    "classes": [
        {
            "className": "AAAA1111",
            "marks": [72, 85, 64],
            "grades": [20, 40, 30]
        },
        {
            "className": "BBBB2222",
            "marks": [12, 25, 43],
            "grades": [32, 42, 32]
        }
    ]
}

如何使用somebody@gmail.com?

的电子邮件向该人员添加其他课程

例如,如何添加子文档

{
    "className": "CCCC3333",
    "marks": [75, 85, 95],
    "grades": [20, 30, 50]
}

同时保留现有信息?如何在不影响文档其余部分的情况下删除类AAAA1111?我是mongo的新手,并且遇到了我尝试的解决方案的问题。什么是最佳做法?

3 个答案:

答案 0 :(得分:1)

操作将新类添加到数组中:

db.users.update({"email": "somebody@gmail.com"}, {
    $push: {
        "classes": {
            "className": "CCCC3333",
            "marks": [75, 85, 95],
            "grades": [20, 30, 50]
        }
    }
});

操作从数组中删除特定类:

db.users.update({"email": "somebody@gmail.com"}, {
    $pull: {
        "classes": {
            "className": "AAAA1111"
        }
    }
});

答案 1 :(得分:1)

要向使用somebody@gmail.com电子邮件的人员添加另一个课程,请在更新文档中使用 positional $ 运算符,因为这会标识要更新的数组中的元素没有明确指定数组中元素的位置。在更新嵌入文档中的字段时,需要使用点表示法。使用 dot notation 时,请将整个虚线字段名称括在引号中。以下内容更新了嵌入式classes文档中的users数组。

定义updateClasses函数,如下所示:

var updateClasses = function(db, callback) {
   db.collection('classes').updateOne(
        { "users.email" : "somebody@gmail.com" },
        {
            "$push": {
                "users.$.classes": {
                    "className": "CCCC3333",
                    "marks": [75, 85, 95],
                    "grades": [20, 30, 50]
                }
            }
        }, function(err, results) {
        console.log(results);
        callback();
   });
};

调用updateClasses函数。

MongoClient.connect(url, function(err, db) {
    // handle error
    if (err) handleError(err);

    updateClasses(db, function() {
        db.close();
    });
});

要删除课程"AAAA1111"而不影响文档的其余部分,请使用 $pull 运算符,该运算符从现有数组中删除与a匹配的值的所有实例指定条件:

db.collection('classes').updateOne(
    { "users.email" : "somebody@gmail.com" },
    {
        "$push": {
            "users.$.classes": {
                "className": "AAAA1111"
            }
        }
    }, function(err, results) {
    console.log(results);
    callback();
});

答案 2 :(得分:0)

要向class添加classes,您可以检索文档,将新的类数组推送到classes并保存文档:

users.findOne({
    email: 'somebody@gmail.com'
}).exec(function(err, user) {
    var newClass = {
        className: 'CCCC3333',
        marks: [75, 85, 95],
        grades: [20, 30, 50]
    };

    user.classes.push(newClass);
    user.save(function(err) {
        if(err) console.log(err);
        console.log('Updated!');
    });
});