6

学生データが入力された単純なコレクションがあり、いくつかのパラメーターに基づいていくつかのレコードを削除する必要があります。私はmongoshellから以下を実行しました

for(i=0;i<200;i++) {
    var rec = db.grades.find({student_id:i,type:'homework'}).sort({score:1}).limit(1)
    db.grades.remove(rec)
}

理想的には、すべてのstudent_idの宿題タイプの最低スコアを削除する必要があります。どうやら、findパラメーターの最後の2つのレコード(student_id:199)のみがパージされ、残りはまだ存在しています。

db.grades.find({student_id:10,type:'homework'}).sort({score:1}).limit(1)
{ "_id" : ObjectId("50906d7fa3c412bb040eb5a1"), "student_id" : 10, "type" : "homework", "score" : 6.094174990746648 }

JS / Mongoの不穏な性質のせいですか?同じことを解決するための他の選択肢は何ですか?

4

3 に答える 3

9

recドキュメントではなく、データベースカーソルです。実際にそこからドキュメントを取得する必要があります。

for(i=0;i<200;i++) {
    var cur = db.grades.find({student_id:i,type:'homework'}).sort({score:1}).limit(1);
    var actualDoc = cur.next();
    db.grades.remove(actualDoc);
}

それ以外の場合は、カーソルのプロパティに基づいてドキュメントを削除しようとしていますが、これは目的ではありません。http://docs.mongodb.org/manual/core/read-operations/#cursorsも参照してください。

于 2013-02-06T03:58:17.483 に答える
1

コレクションを照会し、最初にコレクション内のすべてのドキュメントを返す必要があります。

var collection = grades.find({'type':'homework'}).sort({'student_id',1, 'score':1})

次に、変数「コレクション」内のレコードを反復処理して、スコアが最も低いドキュメントを削除します。コレクション内のドキュメントを割り当てずに、student_id に値として i を割り当てるという問題もあります。コードによると、学生 ID に基づいてコレクションを反復処理しています。コレクションを反復処理するためにこれを行う必要はありません。タイプ宿題のすべてのレコードを照会してから、パラメーターに基づいて削除します。Student_id の値を変数に割り当てる必要がある場合 (ヒント: レコードを削除するためのパラメーターとして)、次のように Student_id を変数に割り当てます。

var id = ['student_id']

または (これが私が行った方法です)、すべてのレコードを最初に student_id で並べ替え、次にスコアで並べ替えることができます。スコアは降順でソートする必要があります。

次に、for ループを使用してコレクションを反復処理し、student_id が変更されたらレコードを削除します。Student_id の変更を認識するには、その値をループの外側とループの内側の変数に (2 つの個別の変数として) 格納し、コレクションをループするときにそれらを更新します。次に変数を比較し、変数の値が等しくない場合はレコードを削除します。

于 2013-02-03T08:39:55.783 に答える
0
var oldid=-1;
var cursor=db.grades.find({'type':'homework'}).sort({'student_id':1,'score':1});
while (cursor.hasNext()) { 
    var doc = cursor.next(); 
    var id = doc['student_id']; 
    if (oldid!=id) 
    {
        db.grades.remove(doc);
        oldid=id; 
    } 
 }
于 2014-09-19T02:05:29.187 に答える