在mongodb中使用$set时获得不希望的结果

cyvaqqii  于 2023-11-17  发布在  Go
关注(0)|答案(1)|浏览(120)

我在mongodb的集合中存储了一个对象

{
  "students" : {
    "[email protected]" : {"gender" : "M", "marks" : 30},
    "[email protected]" : {"gender" : "M", "marks" : 40}
  }
}

字符串
我尝试使用以下代码片段更新id为“email protected(https://stackoverflow.com/cdn-cgi/l/email-protection)“的学生的分数:

db.getCollection('school').updateOne(
    {
        $set:{
            "[email protected]": {
                "gender":"M",
                "marks": 40
            }
        }
    }
)


但它不是更新现有的记录,而是创建一个新的对象,如下所示:

{
  "students" : {
    "[email protected]" : {"gender" : "M", "marks" : 30},
    "[email protected]" : {"gender" : "M", "marks" : 40},
    "xyz@gmail" : {"com" : {"gender" : "M", "marks" : 40}}
  }
}


所以,这是因为电子邮件ID中的.而发生的。mongodb有办法处理这个问题吗?感谢任何帮助,提前感谢!

gc0ot86w

gc0ot86w1#

我把这个放在一个答案中,因为它不适合所有的评论。
我鼓励你读一下这个。
如果你继续在关键字中使用点,那么你会发现很难进行更新,并且会在应用程序中遇到很多问题。
我的建议是,如果可以的话,把结构改成这样:

{
  students : [
    {email: "[email protected]", gender: "M", marks: 30},
    {email: "[email protected]", gender: "M", marks: 40}
  ]
}

字符串
这将允许你做:

db.getCollection('school').updateOne({students: {$elemMatch: {email:'[email protected]'}}},
    {
        $set: {
            "students.$": {
                "email": "[email protected]",
                "gender":"M",
                "marks": 100
            }
        }
    }
);

相关问题