Ответ 1
Я думаю, что вы могли бы использовать $в операторе mongodb.
http://docs.mongodb.org/manual/reference/operator/query/in/
Что-то вроде:
UTUSTP.remove({_id: {$in: wronglist}}, function(){...}); // and so on
У меня есть большой список идентификаторов, которые я хочу удалить из mongodb из нескольких моделей. Основная идея заключается в том, что у меня одинаковый идентификатор документа в нескольких схемах, и я хотел бы удалить документ из каждой модели. Я делаю это так:
_.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);
})
})
Проблема в том, что у меня есть 14000+ идентификаторов в wrongList
, и запрос работает, но для завершения требуется много времени... как увеличить время удаления? Можно ли удалить пакет или что-то в этом роде?
Я думаю, что вы могли бы использовать $в операторе mongodb.
http://docs.mongodb.org/manual/reference/operator/query/in/
Что-то вроде:
UTUSTP.remove({_id: {$in: wronglist}}, function(){...}); // and so on
Предполагая, что вы используете lo-dash
, вы можете получить коллекцию идентификаторов item
с помощью функции _.pluck
. Позвольте называть его idsArray
.
Теперь вы можете использовать оператор $in
в async.parallel
, используя 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
для каждой коллекции.