繁体   English   中英

奇怪的MongoDB行为

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM