描述: 格式如下所示,其中每个对象有_id,name,和一个数组scores,其中可以看到修改前的数组中,每个document有两个type为"homework"的对象。
*提问*: 问题是如何操纵mongo数据库,批量修改db.students,让每个document中,删除score较小的homework,而保留score较大的homework。
修改前:
{
"_id" : 100,
"name" : "Demarcus Audette",
"scores" : [
{
"score" : 47.42608580155614,
"type" : "exam"
},
{
"score" : 44.83416623719906,
"type" : "quiz"
},
{
"score" : 19.01726616178844,
"type" : "homework"
},
{
"score" : 39.01726616178844,
"type" : "homework"
}
]
}
修改后:
{
"_id" : 100,
"name" : "Demarcus Audette",
"scores" : [
{
"score" : 47.42608580155614,
"type" : "exam"
},
{
"score" : 44.83416623719906,
"type" : "quiz"
},
{
"score" : 39.01726616178844,
"type" : "homework"
}
]
}
下面附上一段nodejs上跑的代码(自己写的,有问题跑不通,作为参考):
var MongoClient = require('mongodb').MongoClient;
MongoClient.connect('mongodb://localhost:27017/school', function(err, db){
if(err) throw err;
var query = {};
var cursor = db.collection('students').find(query);
cursor.each(function(err, doc){
if(err)throw err;
if(doc == null){return db.close();}
/*TODO*/
var target1 = doc.scores[2];
var target2 = doc.scores[3];
if(target1 < target2) doc.update({$unset: target1});
else doc.update({$unset: target2});
console.dir("Successfully found " + target1);
});
});
我估计你想要的是 in place update,比如 findAndEval 类似的方法,然后要让你失望了
https://jira.mongodb.org/browse/SERVER-458
目前为止还没有实现,被列在 Planning Bucket B 里,实现目测遥遥无期。
嗯,上面说的没有实现是指没法在服务器端完成(mongo 和 mongod 的关系)
如果在客户端完成,可以用 cursor.forEach 方法,比如