2010-11-12 7 views
9

Из-за ошибки в клиентском коде, mongodb создали множество коллекций «mr.mapreduce ....», как их удалить (возможно, с помощью маски).MongoDB remove mapreduce collection

ответ

14

Я бегу сценарий в интерактивной оболочке:

function f() { 
    var names = db.getCollectionNames(); 
    for(var i = 0; i < names.length; i++){ 
    if(names[i].indexOf("mr.") == 0){ 
    db[names[i]].drop();}}}; 
f(); 

Это помогает устранить проблему.

+0

скопировал тот же код, но не работал для меня :(EDIT: имя было другим. Оно работает сейчас. Спасибо. – theTuxRacer

+1

Хорошая идея. Возможно, вы захотите рассмотреть причину проблемы в долгосрочной перспективе. Создание (и уход) загрузки временных коллекций для ручной очистки, вероятно, не является идеальным. –

+1

Вы должны написать> if (names [i] .indexOf ("tmp.mr.") == 0) {<, потому что коллекции имеют имена типа tmp.mrreduce_1295256376_56_inc –

3

Временной карта-свертке таблица должна быть очищена, когда соединение, которое создало их замкнуто:

карты/уменьшить вызываются с помощью команды базы данных. База данных создает временную коллекцию для хранения вывода операции . Коллекция очищается, когда клиентское соединение закрывается или при явном удалении. В качестве альтернативы можно указать имя постоянной коллекции . map и функции сокращения записываются в JavaScript и выполняются на сервере.

- MongoDB docs

Если нет, то вы можете удалить их с помощью их метода, который вы удалили бы любой другой коллекции. Это может быть немного повторяющимся.

3

Другой способ добиться того же этот фрагмент:

db.system.namespaces.find({name: /tmp.mr/}).forEach(function(z) { 
    try{ 
    db.getMongo().getCollection(z.name).drop(); 
    } catch(err) {} 
}); 

Pro: Он не будет пытаться собрать все пространства имен в массив JavaScript. MongoDB segfaults на слишком большом пространстве имен.