从名为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的新手,并且遇到了我尝试的解决方案的问题。什么是最佳做法?
答案 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!');
});
});