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
                }
        ]
}

宿題を最小のスコアで削除する方法を探しています。ここで関連する回答を見つけましたが、スコアが最も低い「宿題」だけを見つけて削除する必要があるため、あまり役に立ちません。

PyMongo Driver とともに MongoDB を使用しています。

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

ネイティブの mongodb コマンドを使用してみましたが、動作します。以下の 2 つのコマンドを使用して動作させます。

1) カーソル = 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.minitem}}}) }))

于 2015-08-23T09:07:32.870 に答える
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 に答える
0

ネイティブのmongodbコマンドを使用することは不可能だと思います。それを行う最善の方法は、JavaScript関数を記述して最低スコアを削除し、サーバーで実行することだと思います。これには自動であるという利点があるため、リストから削除している間はリストを更新できず、一貫性が保たれます。

ここにいくつかのドキュメントがあります: http://docs.mongodb.org/manual/applications/server-side-javascript/

于 2013-02-09T12:58:06.170 に答える