我有一个填充了学生数据的简单集合,我需要根据一些参数删除一些记录。我从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_ids类型的家庭作业的最低分数。显然,只有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的aysnchorous性质?解决问题的其他选择是什么?
答案 0 :(得分: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。
答案 1 :(得分:1)
在迭代之前,您需要先查询集合并返回集合中的所有文档,例如
。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']
或者(这就是我这样做的方式),你可以先用student_id然后按分数对所有记录进行排序。分数应按降序排序。
然后使用for循环遍历集合,并在student_id更改时删除记录。要识别student_id中的变化,将该值存储在循环外部和循环内的变量中(作为2个单独的变量),然后在循环访问集合时更新它们。然后比较变量并在变量值不相等的情况下删除记录。
答案 2 :(得分: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;
}
}