【问题标题】:Compare array elements,remove the one with the lowest score比较数组元素,删除得分最低的元素
【发布时间】:2015-04-03 21:07:59
【问题描述】:

学校数据库中有 200 个文档。我必须删除每个具有 "type":"homework" 和最低分数的文档。

    {
        "_id" : 0,
        "name" : "aimee Zank",
        "scores" :
        [
            {
                "type" : "exam",
                "score" : 1.463179736705023
            },
            {
                "type" : "quiz",
                "score" : 11.78273309957772
            },
            {
                "type" : "homework",
                "score" : 6.676176060654615
            },
            {
                "type" : "homework",
                "score" : 35.8740349954354
            }
        ]
    }

例如,这里

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

必须删除,因为 score = 6.6

我把所有的文档都这样排序:

db.students.find({"scores.type":"homework"}).sort({"scores.score":1})

但我不知道如何删除分数最低的文档并键入:homework??? 注意:如何不使用聚合方法来解决它?例如,通过排序然后更新。

【问题讨论】:

    标签: mongodb database nosql


    【解决方案1】:

    这可以通过几个步骤完成。第一步是使用带有$match$unwind$group 运算符的聚合框架来获取具有最低分数的文档列表,这些运算符可以简化您的文档以找到每个文档的最低分数:

    lowest_scores_docs = db.school.aggregate([ 
        { "$match": {"scores.type": "homework"} },
        { "$unwind": "$scores" },  { "$match": {"scores.type": "homework"} },
        { "$group": { "_id":"$_id", "lowest_score": {"$min": "$scores.score" } } } ] )
    

    第二步,遍历上面的字典,在更新查询中使用$pull操作符从数组中移除元素,如下:

    for result in lowest_scores_docs["result"]:
        db.school.update({ "_id": result["_id"] }, 
            { "$pull": { "scores": { "score": result["lowest_score"] } } } )
    

    【讨论】:

    • 嗨,克瑞丹。我非常感谢您的快速回复。但不幸的是,它也没有删除每个文档中具有“type”:“homework”和每个_id.中的最小值的数组元素。
    • @sapio_l 是否显示任何错误消息?您是否尝试过打印对象 lowest_scores_docs 以查看聚合是否返回了任何内容?
    • 是的,我做到了。循环不起作用,它什么也不打印。 @chridam
    • 现在我用另一种方法:db.students.find({"scores.type":"homework"}).sort({"scores.score":1}) 但我不知道如何删除得分最低的第二个文档和类型:使用更新功能的作业。 @chridam
    • 我再次尝试了您的代码。非常感谢!有效。但是它会删除分数数组中的最低分数,但是,我想删除“类型”:“作业”中具有最低分数的项目。虽然你写了 { "$match": {"scores.type": "homework"} },但我看到它没有考虑它。为什么?我很难修复它。
    【解决方案2】:
    import pymongo
    import sys
    
    # connnecto to the db on standard port
    connection = pymongo.MongoClient("mongodb://localhost")
    
    db = connection.school           # attach to db
    students = db.students        # specify the colllection
    
    
    try:
    
            cursor = students.find({})
            print(type(cursor))
            for doc in cursor:
                hw_scores = []
                for item in doc["scores"]:
                    if item["type"] == "homework":
                        hw_scores.append(item["score"])
                hw_scores.sort()
                hw_min = hw_scores[0]
                #students.update({"_id": doc["_id"]},
                 #           {"$pull":{"scores":{"score":hw_min}}})
    
    
    except:
        print ("Error trying to read collection:" + sys.exc_info()[0])
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-03-22
      • 2016-03-25
      • 2012-06-09
      • 1970-01-01
      • 2021-09-17
      • 2015-07-28
      • 1970-01-01
      相关资源
      最近更新 更多