在mongodb中使用$set时获得不良结果

Getting undesired result while using $set in mongodb

提问人:Vishal 提问时间:11/15/2023 更新时间:11/16/2023 访问量:51

问:

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

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

我正在尝试使用以下代码片段更新ID为“[email protected]”的学生的分数:

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有没有办法处理这个问题? 感谢任何帮助,提前致谢!

mongodb mongodb查询

评论

0赞 Joe 11/16/2023
字段名称使用虚线表示法进行引用。在 $set 子句中,您希望数据库将第一个点视为字段分隔符,但将第二个点视为字段名称的一部分。因此,最好避免使用包含“$”或“.”的字段名称。

答:

2赞 jQueeny 11/16/2023 #1

我把它放在一个答案中,因为它并不完全适合评论。

我鼓励您阅读本文

如果您继续在密钥中使用点,那么您将发现很难进行更新,并且会在您的应用程序中遇到很多问题。

如果可以的话,我的建议是将结构更改为如下所示:

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