【发布时间】:2013-08-23 15:42:21
【问题描述】:
注意:请使用mongodb shell执行代码。
假设我有一份学生文档,如下所示
{
"_id" : 4,
"grades" : [
{
"grade" : 80,
"mean" : 75,
"std" : 8
},
{
"grade" : 85,
"mean" : 90,
"std" : 5
},
{
"grade" : 85,
"mean" : 90,
"std" : 5
},
{
"grade" : 85,
"mean" : 95,
"std" : 6
},
{
"grade" : 90,
"mean" : 85,
"std" : 5
}
]
}
我们有两个问题:
问题 1 :假设您要更新所有子文档 _id=4 && grades.grade = 85 && grades.std = 5,std=6 您将编写如下
db.students.update( {'$and':[ { _id: 4},{ "grades.grade": 85 }, {"grades.std": 5 } ]}, { $set: { "grades.$.std" : 6 } } );
现在,如果您多次(3 次)执行上述语句,那么理想情况下它应该更新第 2、3 个子文档
但最后一个子文档也正在更新,因为它有 std=5 匹配,但我们给出的条件是 $and 而不是 $or,然后最后一个文档怎么更新了?
问题 2: 现在假设您要删除与查询条件匹配的子文档本身。 我尝试了以下语句
db.students.update({_id:4,'grades.grade':85},{'$unset':{'grades.$':1}})
因为 $unset 在子文档/数组的情况下会设置 null,如何解决这个问题?
如何在您的 mongodb 控制台中复制?
db.students.insert( { "_id" : 4, "grades" : [ { grade: 80, mean: 75, std: 8 }, { grade: 85, mean: 90, std: 5 }, { grade: 85, mean: 90, std: 5 }, { grade: 85, mean: 95, std: 6 }, { grade: 90, mean: 85, std: 5 } ] });
【问题讨论】:
标签: mongodb mongodb-query mongodb-update