MongoDB,更新固定集合

4
有人知道在Mongo3.2中更新被盖住的集合的方法吗?我曾在2.x版本中操作过,更新集合并删除所有内容,这样我就知道它已经被处理了。然后再进行老化处理。
当我在3.2中进行相同操作时,在命令行上会出现以下错误。
无法更改被盖住的集合中文档的大小:318!= 40
在这里,你可以看到我正在将文档从318字节缩小到40字节。
有没有办法解决这个问题呢?

你能展示一下你的查询语句,以及你调整大小后的结果和数据库中yourCollection的总大小吗? - rummykhan
因此,该命令的输出如下所示:db.metrics.totalSize() 196608实际上,该命令是从Python脚本中调用的。但它会产生类似的效果:db.metrics.upate({"_id":<something>, "NewTime":<New Time>})这在2.x版本中之前是有效的,因此我相信语法是正确的。 - Jonathan Perrozzi
4个回答

5
根据MongoDB文档所述,
如果更新或替换操作更改了文档的大小,则该操作将失败。这个变化发生在版本3.2中。
因此,如果您的操作更改了受限集合的大小,则在MongoDB 3.2+中是不允许的。
参考链接:https://docs.mongodb.com/manual/core/capped-collections/

3
在3.2版本中,不再允许在被限制的集合中缩小文档。我在文档中没有找到任何相关内容,但是在https://jira.mongodb.org/browse/SERVER-20529上有一个解释(基本上无法回滚缩小文档)。您唯一的选择是查找相同大小的更新,例如更新布尔值。

欢迎来到Stack Overflow!虽然这个回答在理论上可能解决了问题,但最好还是在这里包含回答的关键部分,并提供链接作为参考。 - Tobi Nary

3

固定大小集合称为 Capped Collections。因此,当记录更新超过其先前分配的大小时,它将失败。

自版本3.2起发生了更改。

如果更新或替换操作更改文档大小,则操作将失败。

有关更多信息,请访问链接:https://docs.mongodb.com/manual/core/capped-collections/

因此,解决方案是创建一个新的 Collection,而不选择 capped 集合(如果符合您的要求),这样就能正常工作。


1
[Solve] 它对我有用 创建一个新的非限制集合并复制所有文档。 复制、替换你的集合名称并粘贴到终端中。
// replace <mycol> by <your collections name>
db.createCollection( "mycol_temp")
var cur = db.mycol.find()
while (cur.hasNext()) {
 mycol = cur.next();
 db.mycol_temp.insert(logItem);
}
db.mycol.drop()
db.mycol_temp.renameCollection("mycol")

现在,可以接受update()或remove()文档。

2
在生产环境中,这实际上不是一个选项,因为您的集合可能非常庞大。 - Stefano Ricciardi

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