2

我在 MongoDB 中有以下方案:

{
        "_id" : 100,
        "name" : "John Doe",
        "scores" : [
                {
                        "type" : "exam",
                        "score" : 334.45023
                },
                {
                        "type" : "quiz",
                        "score" : 11.78273309957772
                },
                {
                        "type" : "homework",
                        "score" : 6.676176060654615
                },
                {
                        "type" : "homework",
                        "score" : 35.8740349954354
                }
        ]
}

我正在寻找一种以最低分数移除作业的方法。我在这里找到了一个相关的答案,但是它并没有多大帮助,因为我只需要找出分数最低的“家庭作业”并将其删除。

我正在使用 MongoDB 和 PyMongo 驱动程序。

4

5 回答 5

3

您需要添加match如下:

    myresults = scores.aggregate( [ { "$unwind": "$scores" }, { '$match': {'scores.type': "homework" } }, { "$group": { '_id':'$_id' , 'minitem': { '$min': "$scores.score" } } } ] )

    for result in myresults['result']:
        scores.update( { '_id': result['_id'] }, { '$pull': { 'scores': { 'score': result['minitem'] } } } )
于 2013-02-11T06:15:17.383 回答
1

这是使用 Python 的解决方案:

students = db.students
cursor = students.find({})
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}}})
于 2015-11-04T10:53:08.913 回答
1

我尝试使用本机 mongodb 命令并且它有效。使用以下 2 个命令使其工作。

1) cursor = db.students.aggregate([{ "$unwind": "$scores" }, { "$match": { "scores.type": "homework"}},{ "$group": {' _id': '$_id', 'miniitem': {'$min':"$scores.score"}}}]), null

2) cursor.forEach(function(coll) {db.students.update({'_id': coll._id}, {'$pull': {'scores': {'score': coll.miniitem}}}) })

于 2015-08-23T09:07:32.870 回答
0

我认为不可能使用本机 mongodb 命令。我认为最好的方法是编写一个javascript函数来降低最低分数并在服务器上运行它;这将具有自动的优势,因此在您从中删除列表时无法更新列表,从而保持一致。

这是一些文档:http ://docs.mongodb.org/manual/applications/server-side-javascript/

于 2013-02-09T12:58:06.170 回答
0

我在这里遵循了第三个答案。删除 MongoDB 中特定属性类型的最小元素

    var MongoClient = require('mongodb').MongoClient;

    MongoClient.connect('mongodb://localhost:27017/school', function(err, db) {
      if(err) throw err;

      var students = db.collection('students');
      cursor = students.aggregate(
    [{ "$unwind": "$scores" }, 
     { "$match": { "scores.type": "homework"}},
     { "$group": {'_id': '$_id', 'minitem': {
                    '$min': "$scores.score"
                }
            }
        }

    ]);

    cursor.forEach(
    function(coll) {
        students.update({
            '_id': coll._id
        }, {
            '$pull': {
                'scores': {
                    'score': coll.minitem
                }
            }
        })
    });
    });
于 2015-06-13T03:39:15.780 回答