3

Python 言語を使用する mongo コースを受講しています。各生徒の宿題の最低成績を削除/削除する必要があります。このクエリを使用して、宿題の成績を取得し、生徒と成績で並べ替えました

db.grades.find( { 'type' : 'homework' }, { 'student_id' : 1, 'score' : 1, '_id' : 0}).sort({ 'student_id' : 1, 'score' : 1 })

このように学生IDと点数だけが表示されるようにクエリをアレンジしました。これらは最初の 10 人の学生だけです。実際には 400 あります。次に、それらを並べ替えて、それぞれの最低グレードを削除する必要があります。

質問は、これをどのように並べ替えて、各生徒の最低成績を削除するのですか?

{ "student_id" : 0, "score" : 14.8504576811645 }
{ "student_id" : 0, "score" : 63.98402553675503 }
{ "student_id" : 1, "score" : 21.33260810416115 }
{ "student_id" : 1, "score" : 44.31667452616328 }
{ "student_id" : 2, "score" : 60.9750047106029 }
{ "student_id" : 2, "score" : 97.75889721343528 }
{ "student_id" : 3, "score" : 50.81577033538815 }
{ "student_id" : 3, "score" : 92.71871597581605 }
{ "student_id" : 4, "score" : 5.244452510818443 }
{ "student_id" : 4, "score" : 28.656451042441 }
{ "student_id" : 5, "score" : 23.29430953857654 }
{ "student_id" : 5, "score" : 41.21853026961924 }
{ "student_id" : 6, "score" : 81.23822046161325 }
{ "student_id" : 6, "score" : 89.72700715074382 }
{ "student_id" : 7, "score" : 63.35102050393443 }
{ "student_id" : 7, "score" : 85.56691619291915 }
{ "student_id" : 8, "score" : 66.42784200049636 }
{ "student_id" : 8, "score" : 67.29005808579812 }
{ "student_id" : 9, "score" : 16.60130789148128 }
{ "student_id" : 9, "score" : 75.29561445722392 }
4

5 に答える 5

4

これは JavaScript で書かれたソリューションです

var students = db.grades.find( { 'type' : 'homework' }, { 'student_id' : 1, 'score' : 1, '_id' : 0}).sort({ 'student_id' : 1, 'score' : 1 })

// Create a variable to track student_id so we can detect when it changes
var id = "";

// Loop through our query results. Each document in the query is passed into a function as 'student'
students.forEach(function (student) { 
    if (id !== student.student_id) { 
        db.grades.remove(student)
        id = student.student_id; 
    }
});
于 2012-11-03T23:45:25.987 に答える
1

ハハ、これが私が宿題をした方法です:

import pymongo
import sys
connection = pymongo.Connection("mongodb://localhost", safe=True)
db=connection.students
grades = db.grades

def delete_lowest_score():

print "grading nice?! look at these scores now!"

query = {'type':'homework'}
sort = [('student_id',pymongo.ASCENDING),('score',pymongo.ASCENDING)]
track = -1

try:

    cursor = grades.find(query).sort(sort)

except:
    print "Unexpected error:", sys.exc_info()[0]

for doc in cursor:
    if doc['student_id'] != track:
        grades.remove(doc)
        track = doc['student_id']


delete_lowest_score()
于 2012-11-04T19:56:06.843 に答える
1
connection = pymongo.MongoClient("mongodb://localhost" , safe = True)
db = connection.students           
collection = db.grades      
query = {}
iter = collection.find({'type':'homework'}).sort([('student_id',pymongo.ASCENDING),  ('score',pymongo.ASCENDING)])
try:
    for doc in iter:
    nextStudentId =  iter.next()
        if ((doc['student_id']) == nextStudentId['student_id']):
            collection.remove({"_id":doc['_id']})
except:
    print "Error trying to read collection:" + sys.exc_info()[0]
于 2013-12-09T17:03:47.497 に答える
0

私も同じコースを受講しています。

締め切りが過ぎたので...次のようにうまくいったようです:

import pymongo, sys
connection = pymongo.Connection("mongodb://localhost",safe=True)
db=connection.students
### s1 for sample (a cursor (iterable)); sort first by "student_id"
s1=db.grades.find({"type":"homework"}).sort([("student_id", pymongo.ASCENDING),("score", pymongo.DESCENDING)])
### c1 is a counter; note every 2nd record will be the lower score for that student 
c1=1
for d in s1: # d for document
    id1=d["_id"] # id1 is particular id
    if c1%2==0: # c1 divisible by 2?
       db.grades.remove({"_id":id1})
    c1=c1+1

これにより、宿題の 2 つのスコアのうち低い方のレコードがすべて削除され、元のコレクションが変更され、600 レコードが残ります。インターフェイスに変更すると、ここmongoに記載されているすべての例を複製できます。Java

これは@scicholasの回答のバリエーションであり、少し簡潔であることを認めます。上記を実行する前にレコードを繰り返し処理していたため、最初はカーソルの使用に問題がありました。s1.rewind()Python でインタラクティブに検査している場合は、最初にリセットすることを忘れないでください。

于 2012-11-11T03:33:49.360 に答える
0

ここにC#があります

static async Task MainAsync(string[] args)
    {
        var connectionString = "mongodb://localhost:27017";
        var client = new MongoClient(connectionString);

        var db = client.GetDatabase("students");
        var col = db.GetCollection<Grade>("grades");

        var builder = Builders<Grade>.Filter;
        var filter = builder.Eq("type", "homework");
        var gradedHomework = await col.Find(filter)
                .Sort(Builders<Grade>.Sort.Ascending("student_id").Ascending("score"))
                .ToListAsync();

        var sid = -1;

        foreach (Grade doc in gradedHomework)
        {

            if (sid != doc.student_id)
            {
               var result = await col.DeleteOneAsync(x => x.Id == doc.Id);
                Console.WriteLine(doc.score);
                sid = doc.student_id;
            }

        }



    }



    public class Grade
    {
        public object Id { get; set; }
        public int student_id { get; set; }
        public string type { get; set; }
        public double score { get; set; }
    }
}
于 2016-08-16T05:41:44.343 に答える