繁体   English   中英

Mongo提供$ snapshot的好处? 可以默认禁用吗?

[英]Benefit of $snapshot with Mongo? Is it okay to disable by default?

这个Mongo页面解释了$ snapshop命令的作用,但是有人可以解释为什么这会有所帮助,或者默认情况下禁用它是否明智?

我们在Rails 3.2.12上使用MongoMapper,而MM似乎在每个查询上都启用了快照。

由此,我们应该假设,如果有可能同时读写一个文档,那么我们不应该关闭$ snapshot吗? 或者,更确切地说,最坏的情况是什么? 那个用户得到了一个过时的文档?

否。不是陈旧的文档。 但是可能两次相同的文档,分别是在应用更新之前(当时还不陈旧)和应用更新之后。

仅当更新更改了文档大小时才会发生这种情况,因此必须将其物理移动到存储位置。 就地更新不会发生这种情况。 如果将较大的内容推入数组,则可能会发生这种情况。

还要注意,根据您的看法,您可以将文档的第一个版本称为“陈旧的”(在查询完成时),但是所有其他文档也是如此:您获得的版本是准确的在您的查询提取此单个文档时。 在整个查询中不一定全局一致。

最后,即使启用了$ snapshot,您仍然不能保证不会删除文件并获得所有新插入的文件。 显然,它也不能与分片一起使用。

从好的方面来说,您获得的文档(打开或关闭快照)在内部始终是一致的:您始终获得的版本一次存在,而不是在更新过程中处于异常状态。

假设一个查询返回一个用户及其所有关联的小部件。 通过禁用$ snapshot,此查询将返回播放器文档两次... ...这意味着返回数组可以包含两个对象而不是一个对象?

如果它们存储在两个集合中,则相同的查询不能返回“用户及其所有窗口小部件”。 MongoDB中没有任何联接。

如果将小部件嵌入到用户对象中,则它们将与用户一起返回,并且始终代表一致的组合。

此处可能发生的情况是,如果您查询具有小部件A或Z的所有用户的列表,并且更新了具有小部件A的用户也具有小部件Z(这会移动文档,因为它现在已经增长了),您可以使用小部件A获取用户,然后再次使用小部件A和Z获取用户。

如果打开快照,则不会发生(除非您使用分片,而快照显然无法使用)。 但是,您仍然可以获取正在被并发删除的用户,或者无法获取查询运行时正在插入的所有用户。

扫描MongoMapper和MongoClient代码似乎默认情况下关闭了$ snapshot。 检查您的代码是否将其作为选项传递给某个地方的查询。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM