与Mongo一起使用$ snapshot的好处?可以默认禁用吗?

时间:2013-05-19 22:42:11

标签: ruby-on-rails-3 mongodb mongomapper

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

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

2 个答案:

答案 0 :(得分:1)

  

由此,我们应该假设如果有可能并行写入和读取文档,那么我们不应该关闭$ snapshot吗?或者,更确切地说,最坏的情况是什么?那个用户得到陈旧的文件?

没有。不是陈旧的文件。但可能是同一个文档两次,在应用更新之前(当时不是陈旧)和应用更新之后。

只有在更新更改文档大小时才会发生这种情况,因此必须在存储位置物理移动它。就地更新不会发生这种情况。如果你把一些大东西推到一个数组中就会发生。

另请注意,根据您对此的看法,您可以将文档的第一个版本称为“陈旧”(在查询完成时),但同样适用于所有其他文档:您获得的版本在您的查询提取此单个文档时,这是准确的。整个查询不一定全局一致。

最后,即使启用了$ snapshot,您仍然无法保证不会删除已删除的文档并获取所有新插入的文档。显然,它也不适用于分片。

从好的方面来说,你得到的文件(打开或关闭快照)总是内部一致的:你总是得到一个版本,而不是在更新过程中的奇怪状态。

  

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

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

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

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

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

答案 1 :(得分:0)

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