mongo 如何更新文档

mongo how to update a document

给定以下来自名为用户的集合的架构:

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

我如何将另一个 class 添加到电子邮件地址为 somebody@gmail.com?

的人

比如我如何添加子文档

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

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

要将 class 添加到 classes,您可以检索文档,将新的 class 数组推入 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!');
    });
});

Push 操作添加新的 class 到数组:

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

Pull 操作以从数组中删除特定 class:

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

要向电子邮件地址为 somebody@gmail.com 的人添加另一个 class,请使用 positional $ operator in your update document since this identifies an element in an array to update without explicitly specifying the position of the element in the array. As you are updating a field within an embedded document, you would require the use of the dot notation. When using the dot notation,将整个虚线字段括起来引号中的名称。下面更新嵌入的 users 文档中的 classes 数组。

定义一个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();
    });
});

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

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