我有一个很大的id列表,我想从mongodb中删除多个模型,主要思想是我对多个模式中的文档具有相同的id,我想从每个模型中删除一个文档。我是这样做的:
_.each(wrongList, function(item) {
UPUSTP.find({id: item.id}).remove(function(err) {
if (err)
console.log("Error while deleting " + err.message);
})
UPUANAM.find({id: item.id}).remove(function(err) {
if (err)
console.log("Error while deleting " + err.message);
})
UPUEXE.find({id: item.id}).remove(function(err) {
if (err)
console.log("Error while deleting " + err.message);
})
UPUEXO.find({id: item.id}).remove(function(err) {
if (err)
console.log("Error while deleting " + err.message);
})
UPUPROC.find({id: item.id}).remove(function(err) {
if (err)
console.log("Error while deleting " + err.message);
})
})
问题是我在wrongList
中有14000多个ID并且查询有效但是需要花费很多时间才能完成...我怎样才能增加删除的时间?我可以批量删除或类似的东西吗?
答案 0 :(得分:23)
我认为你可以使用mongodb的$ in运算符。
http://docs.mongodb.org/manual/reference/operator/query/in/
类似的东西:
UTUSTP.remove({_id: {$in: wronglist}}, function(){...}); // and so on
答案 1 :(得分:16)
假设您正在使用lo-dash
,您可以使用item
功能获取_.pluck
ID的集合。我们称之为idsArray
。
现在,您可以在async.parallel
调用中使用$in
运算符,直接在模型中使用remove
,例如:
async.parallel({
function (callback) {
UPUSTP.remove({ id: { $in: idsArray } }, function (err) {
if (err) return callback("Error while deleting " + err.message);
callback(null, "Some useful message here...");
});
},
. // do the same with the other collections
.
.
function (err, result) {
// check the error and do somethin useful with the results
}
首先,$in
会将db调用减少到每个集合一个。然后async.parallel
将并行运行任务,最后,直接来自模型的remove
将删除每个集合的find
操作。