【发布时间】:2010-11-12 09:25:31
【问题描述】:
由于客户端代码错误,mongodb 创建了许多“mr.mapreduce....”集合,如何将它们全部删除(可能通过掩码)。
【问题讨论】:
标签: mongodb mongodb-.net-driver
由于客户端代码错误,mongodb 创建了许多“mr.mapreduce....”集合,如何将它们全部删除(可能通过掩码)。
【问题讨论】:
标签: mongodb mongodb-.net-driver
我在交互式 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();
它解决了我的问题。
【讨论】:
3.2.x它已更改为if(names[i].indexOf("tmp.mrs.") == 0)
当创建它们的连接关闭时,应清理临时 map-reduce 表:
map/reduce 通过数据库调用 命令。数据库创建一个 临时集合以保存输出 操作。该系列是 客户端连接时清理 关闭,或显式删除。 或者,可以指定一个 永久输出集合名称。地图 和reduce函数写在 JavaScript 并在服务器上执行。
-- MongoDB docs
如果没有,您可以使用与删除任何其他集合相同的方法删除它们。不过可能会有点重复。
【讨论】:
实现相同目的的另一种方法是这个 sn-p:
db.system.namespaces.find({name: /tmp.mr/}).forEach(function(z) {
try{
db.getMongo().getCollection( z.name ).drop();
} catch(err) {}
});
Pro:它不会尝试将所有命名空间收集到一个 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
【讨论】: