MongoDB 删除 mapreduce 集合

9
由于客户端代码错误,MongoDB创建了许多“mr.mapreduce...”集合,如何删除它们(可能通过掩码)?
4个回答

15

我在交互式shell中运行脚本:

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();

它解决了我的问题。


我复制了同样的代码,但是不起作用 :( 编辑:名称不同。现在它可以工作了。谢谢。 - theTuxRacer
1
好主意。不过你可能需要从长远考虑解决问题的根本原因。创建(并且留下)大量需要手动清理的临时集合可能并不是最理想的做法。 - Mark Embling
1
你应该写成 > if(names[i].indexOf("tmp.mr.") == 0){ < ,因为集合的名称会像 tmp.mr.mapreduce_1295256376_56_inc 这样。 - Andrey Nikishaev
1
对于版本 3.2.x,它已更改为 if(names[i].indexOf("tmp.mrs.") == 0) - Hassek

3
另一种实现相同效果的方法是这个片段:

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

优点:它不会尝试将您的所有命名空间收集到JavaScript数组中。在太多命名空间的情况下,MongoDB会崩溃。


3

当创建它们的连接关闭时,应清理临时map-reduce表:

通过数据库命令调用map/reduce。数据库创建一个临时集合来保存操作的输出。该集合在客户端连接关闭或显式删除时被清除。或者,可以指定永久输出集合名称。map和reduce函数以JavaScript编写,在服务器上执行。

-- MongoDB文档

如果没有这样做,您可以使用与删除其他任何集合相同的方法删除它们。不过,这可能会有点重复。


0

当创建临时的map-reduce集合的连接关闭时,应该清理它们。然而有时它们仍然存在并增加了数据库的大小。您可以使用以下脚本来删除它们:

var database = db.getSiblingDB('yourDatabaseName');
var tmpCollections = database.getCollectionInfos(
    {
        name: {$regex: /tmp\.mr*/},
        'options.temp': true,
    });

tmpCollections.forEach(function (collection) {
    database.getCollection(collection.name).drop();
});

print(`There was ${tmpCollections.length} tmp collection deleted`);

drop.tmp.js脚本可以通过以下命令行执行:

mongo --quiet mongodb://mongodb:27137 drop.tmp.js

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接