gpt4 book ai didi

python - 奇怪的 MongoDB 行为

转载 作者:太空宇宙 更新时间:2023-11-03 18:54:56 25 4
gpt4 key购买 nike

我 3 天前开始学习 MongoDB,在做练习时,我从服务器收到了一些意外的行为。

练习要求编写一个小程序,从具有以下结构的文档中删除最低的家庭作业分数(该文档位于学生集合中):

{
"_id": 10,
"name": "Demarcus Audette",
"scores": [
{
"type": "exam"
"score": 47.42086

},
{
"type": "quiz"
"score": 44.83456

},{
"type": "homework"
"score": 39.0178956

},{
"type": "homework"
"score": 14.578344

}
]
}

无论如何,在编写程序时我不小心犯了一个错误。这是我写的程序

def removeHW(hw):
# establish a connection to the database
connection = MongoClient("localhost", 27017)

# get a handle to the school database
db = connection.school
students = db.students

# extract the scores into a list
scores = []
for i in range(1, len(hw)):
scores.append(hw[i]["score"])

# Now remove the lowest score from the database
query = {"_id": hw[0], "scores.score": min(scores),"scores.type": "homework"}

try:
students.remove(query)
except:
print "Unexpected error:", sys.exc_info()[0]

我的程序背后的逻辑是,在我从students集合中提取包含两个作业和_id的字典列表后,我迭代每个字典并将其传递给removeHW()函数.

我犯的错误是我写道:

query = {"_id": hw[0], "scores.score": min(scores),"scores.type": "homework"}
students.remove(query)

当我应该写下以下内容时(这是正确的解决方案):

query = {"_id": hw[0], "scores.type": "homework"}
students.update(query, {"$pull": {"scores": {"score" : min(scores)}}})

是的,我知道到目前为止似乎一切都很好,确实如此。我遇到的问题是,当使用第一个解决方案(错误的解决方案)时,MongoDB从students集合中删除了所有文档,并创建了一个新集合scores,其中包含来自scores的所有子文档学生集合,除了我想删除的集合(分数最低的作业)。我发现这种行为非常奇怪,而且由于我之前没有使用 NoSQL 数据库的经验,所以我想知道是什么导致 MongoDB 这样做以及为什么。

如果有人可以帮助我理解,请这样做。我将永远感激你。

最佳答案

这种行为是完全正常的,因为给定学生的所有数据都存储在同一个文档中。正在发生的事情是:您收集的每个文档都有一个用于评估类型作业的最低分数。因此每个文档都符合条件并被删除。

在第二个选项中,您采取预防措施,获得一分。但是,您仍然不能确保总是成功。假设测验或考试的分数等于家庭作业分数的最小值。你也可以拉那个。除了检查您提取的评估是否具有最低分数之外,您还应该检查您提取的评估是否属于作业类型。

您的查询部分(“scores.type”:“homework”)只是确保您仅更新作业中至少有一个分数的学生。如果有没有作业的学生,​​可能min有问题;我对Python不太熟悉。

关于python - 奇怪的 MongoDB 行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17493880/

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