由于客户端代码错误,MongoDB创建了许多“mr.mapreduce...”集合,如何删除它们(可能通过掩码)?
我在交互式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();
它解决了我的问题。
db.system.namespaces.find({name: /tmp.mr/}).forEach(function(z) {
try{
db.getMongo().getCollection( z.name ).drop();
} catch(err) {}
});
优点:它不会尝试将您的所有命名空间收集到JavaScript数组中。在太多命名空间的情况下,MongoDB会崩溃。
当创建它们的连接关闭时,应清理临时map-reduce表:
通过数据库命令调用map/reduce。数据库创建一个临时集合来保存操作的输出。该集合在客户端连接关闭或显式删除时被清除。或者,可以指定永久输出集合名称。map和reduce函数以JavaScript编写,在服务器上执行。
-- MongoDB文档
如果没有这样做,您可以使用与删除其他任何集合相同的方法删除它们。不过,这可能会有点重复。
当创建临时的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
3.2.x
,它已更改为if(names[i].indexOf("tmp.mrs.") == 0)
。 - Hassek