如何在不丢失数据的情况下调整mongodb capped集合的大小?

如何在不丢失数据的情况下调整mongodb capped集合的大小?,mongodb,nosql,Mongodb,Nosql,如何在不丢失数据的情况下调整mongodb capped集合的大小 有这样的命令吗,或者有人能提供一个脚本吗?您基本上需要创建一个新的capped集合并将文档复制到其中。这可以在javascript(shell)或您选择的语言中轻松完成 db.createCollection("new", {capped:true, size:1073741824}); /* size in bytes */ db.old.find().forEach(function (d) {db.new.insert(d

如何在不丢失数据的情况下调整mongodb capped集合的大小


有这样的命令吗,或者有人能提供一个脚本吗?

您基本上需要创建一个新的capped集合并将文档复制到其中。这可以在javascript(shell)或您选择的语言中轻松完成

db.createCollection("new", {capped:true, size:1073741824}); /* size in bytes */
db.old.find().forEach(function (d) {db.new.insert(d)});
db.old.renameCollection("bak", true);
db.new.renameCollection("old", true);
注意:切换时确保没有人插入/更新旧集合。如果您在db.eval(“..”)中运行该代码,它将在服务器运行时锁定服务器


有一个增加现有集合大小的功能请求:

这是我调整封顶集合大小的方法:

db.runCommand({"convertToCapped": "log", size: 1000000000});
我已经有了一个名为“log”的封顶集合。所以我只是在它上面再次运行“convertToCapped”,指定一个新的大小。我还没有尝试过缩小收藏规模。这可能是你需要使用Scott Hernandez版本的东西。但这可以在不丢失任何数据或索引的情况下增加封顶集合的大小



编辑:@JMichal是正确的。数据被保留,但索引不被保留,需要重新创建

用于减少集合的大小!这应该是正确的答案。说明:警告此命令获得全局写锁,并将阻止其他操作,直到完成。但它不保留索引,所有索引都必须重新创建,如
convertToCapped
cloneCollectionAsCapped
仅支持原始封顶集合创建方法的字节大小选项。当您需要更改最大文档数时,上述答案的方法显然是唯一的方法。AFAIK这是调整oplog大小的唯一方法,因为您无法将其复制到任何地方