mongo如何更新文件

从命名为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的新手,遇到了我尝试过的解决scheme。 最佳做法是什么?

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

 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" } } }); 

要将另一个类添加到具有somebody@gmail.com电子邮件的人员,请在更新文档中使用positional $运算符,因为这会标识数组中要更新的元素,而不显式指定数组中元素的位置。 在更新embedded式文档中的字段时,您需要使用点符号。 使用点符号时 ,将整个虚线的字段名称用引号引起来。 以下更新embedded式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(); }); }); 

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

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

要将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!'); }); });