gpt4 book ai didi

mongodb - 更新/删除 MongoDB 集合中的子文档

转载 作者:IT老高 更新时间:2023-10-28 13:25:15 25 4
gpt4 key购买 nike

注意:请使用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 次)执行上述语句,那么理想情况下它应该更新第二、第三个子文档

但最后一个子文档也正在更新,因为它有 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 } ] });

最佳答案

'$' 运算符只更新给定的第一个匹配项:

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

要更新,您需要像这样使用 $elemMatch 定位:

db.students.update( { _id: 4, "grades": {$elemMatch: {"grade": 85, "std": 5 }}}, 
{ $set: { "grades.$.std" : 6 } });

但是,您有两个匹配 {"grades.grade": 85, "grades.std": 5}$ 的成绩只更新第一个所以你需要循环直到全部更新:

db.students.update( { _id: 4, "grades": {$elemMatch: {"grade": 85, "std": 5 }}}, 
{ $set: { "grades.$.std" : 6 } })
while (db.getLastErrorObj()['n'] > 0) {
db.students.update( { _id: 4, "grades": {$elemMatch: {"grade": 85, "std": 5 }}},
{ $set: { "grades.$.std" : 6 } })
}

问题 2:同样适用 - 您需要循环到 $pull 匹配元素:

db.students.update({_id:4,'grades': {$elemMatch: {'grade':85}}}, {'$pull': {'grades': {'grade':85}}})

关于mongodb - 更新/删除 MongoDB 集合中的子文档,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18354536/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com