[英]Weird MongoDB Behavior
我三天前开始学习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中去除一切从学生收集文件,并创建包含一切从学生收集子文档除了一个我想删除(作业有一个新的集合得分最低等级)。 我发现这种行为非常奇怪,并且由于我以前没有使用NoSQL数据库的经验,所以我想知道是什么导致MongoDB这样做以及为什么。
如果有人可以帮助我理解,请这样做。 我将永远感激你。
这种行为完全正常,因为给定学生的所有数据都存储在同一文档中。 发生的事情是:您的收藏中的每个文档都有一个用于评估作业类型的最低分数。 因此,每个文档都符合条件并被删除。
在第二个选项中,您要采取谨慎措施以取得一个分数。 但是,仍然不能确保总是成功。 假设测验或考试的分数等于作业分数的最小值。 您也可以拉那个。 除了检查是否以最小分数拉动评估外,还应检查所拉动的评估是否属于作业类型。
查询的一部分(“ scores.type”:“家庭作业”)仅确保您仅更新在家庭作业中得分至少为一的学生。 如果有没有功课的学生,您的min可能有问题。 我对python不熟悉。
MongoDB不会响应删除或更新操作而创建“分数”集合。 特别是,更新或从“学生”收藏夹中删除不会创建“分数”收藏夹。
当您将MongoDB插入到该集合中或向上插入该集合或显式调用create_collection时,它将创建一个集合。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.