使用shell从Mongodb中删除记录

使用shell从Mongodb中删除记录,mongodb,Mongodb,我有一个用学生数据填充的简单集合,我需要根据一些参数删除一些记录。我在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) } 这是因为JS/Mongo的和谐性吗?解决相同问题的其他备选方案是什么?您需要查询集合,并在遍历集合之前首先返回集合中

我有一个用学生数据填充的简单集合,我需要根据一些参数删除一些记录。我在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)
}

这是因为JS/Mongo的和谐性吗?解决相同问题的其他备选方案是什么?

您需要查询集合,并在遍历集合之前首先返回集合中的所有文档,例如

var collection = grades.find({'type':'homework'}).sort({'student_id',1, 'score':1})
然后遍历变量“collection”中的记录,删除得分最低的文档。在不分配集合中的文档的情况下,将i作为值分配给student_id也会出现问题。根据您的代码,您正在基于学生id遍历集合。您不需要这样做来遍历集合。只需查询家庭作业类型的所有记录,然后根据参数删除。如果需要将student_id的值分配给变量(提示:作为删除记录的参数),只需将student_id分配给变量,如下所示:

var id = ['student_id']
或者(我就是这样做的),你可以先按学生id排序,然后按分数排序。分数应按降序排列

然后使用for循环遍历集合,当student_id更改时删除记录。要识别student_id中的更改,请将该值存储在循环外部和循环内部的变量中(作为两个单独的变量),然后在循环集合时更新它们。然后比较变量,如果变量值不相等,则删除记录。

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);
}

for(i=0;iHmm,这有点奇怪。我的意思是,从逻辑上讲,为什么连这个程序都不能运行。for(i=0;看,我已经更新了我的答案。使用rec作为参数首先不会起作用,因为您将i作为值分配给student\u id,我认为如果您从查询中删除student\u id:i,它也会删除所有家庭作业记录
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);
}
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; 
    } 
 }