描述: 格式如下所示,其中每个对象有_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);
});
});
阿神2017-04-17 11:12:39
我估計你想要的是 in place update,比如 findAndEval 類似的方法,然後要讓你失望了
https://jira.mongodb.org/browse/SERVER-458
目前為止還沒有實現,被列在 Planning Bucket B 裏,實現目測遙遙無期。
嗯,上麵說的沒有實現是指沒法在服務器端完成(mongo 和 mongod 的關係)
如果在客戶端完成,可以用 cursor.forEach 方法,比如
db.students.find().snapshot().forEach(
function (e) {
e.删除score较小的homework!;
db.students.save(e);
}
)