jjzjj

MongoDB 填充说明

coder 2023-10-31 原文

查看 capped collections 的用法对于 MongoDB,我想到了以下语句的一个问题:

"You can update documents in a collection after inserting them. However, these updates cannot cause the documents to grow. If the update operation causes the document to grow beyond their original size, the update operation will fail."

所以这本身听起来很合理,即使不能完全解释原因。这让我思考,“如果我不希望文档增长,但可能会添加更多信息(即:$push 到数组),那么将文档填充到我预期的大小会有什么问题。”

所以我的前提再次听起来合理(无论如何对我来说),直到从 FAQ on padding 阅读这个片段.

Warning Do not manually pad documents in a capped collection. Applying manual padding to a document in a capped collection can break replication. Also, the padding is not preserved if you re-sync the MongoDB instance.

这再次提出了我的问题,“为什么会这样?”或者具体地说:

  1. 为什么在这个 wasy“中断复制”中填充一个上限集合中的文档?

  2. 文档中是否遗漏了说明明显原因的部分?或者这只是封顶系列内部运作的“黑魔法”在起作用? (可能链接到“不保留填充”部分)

  3. 或者这只是非常悲观,实际上没有理由不能以这种方式填充? (至少在最近的版本中)。

如果有人能阐明为什么这些陈述是正确的,我们将很高兴。

P.S 虽然这不是严格编程,但我认为手动填充技术是一种编程技术,因此将问题留在这里.

最佳答案

Why would padding a document in a capped collection in this wasy "break replication"?

我认为这里的文档可能有点过分谨慎(参见 DOCS-1528 )。 MongoDB 无法知道字段 padding_foobar 是用于“手动填充”还是包含系统关键信息,因此该技术通常有效,但是

警告 是这样的:MongoDB 初始 复制将始终紧密打包数据,因此当初始复制发生之后 您更改了大小文档的一部分,您以后将无法再次增长该文档。

一个例子(注意:我这里只使用内容大小,这是不正确的,因为字段名称、类型标识、终止符和字符串长度也占用空间,但这只会加强论点):

// 1. insert w/ 20 bytes of 'content'
insert({"name" : "john", "pad" : "0000000000000000"});

// 2. now we're performing an update, removing 16 bytes of padding, adding
//    3 bytes so we now have 7 bytes of 'content'
update({"name" : "john"}, {$unset: {"pad": 1}, $set: {"foo" : "bar"}});

// 3. at this point, we can easily grow the document again, as long as it doesn't
//    grow past its original size of 20 bytes of content
update({"name" : "john"}, {$set: {"foo" : "barfoobar"}});

现在,当初始复制发生在步骤 2) 之后时,文档将在没有填充字段的情况下进行复制,因此副本上的“内容大小”只有 7 个字节。在这种情况下,步骤 3) 中的操作将失败,因为它会使文档增长超过副本文档的“原始大小”,这与主文档的原始大小不匹配。

换句话说,当且仅当您的更新严格保持或减小对象大小时,该技术才有效。您是否可以确保在您的应用程序逻辑中做到这一点(例如,因为这样的文档永远只有一次更新)只有您可以回答。

关于MongoDB 填充说明,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21823374/

有关MongoDB 填充说明的更多相关文章

  1. ruby - 什么是填充的 Base64 编码字符串以及如何在 ruby​​ 中生成它们? - 2

    我正在使用的第三方API的文档状态:"[O]urAPIonlyacceptspaddedBase64encodedstrings."什么是“填充的Base64编码字符串”以及如何在Ruby中生成它们。下面的代码是我第一次尝试创建转换为Base64的JSON格式数据。xa=Base64.encode64(a.to_json) 最佳答案 他们说的padding其实就是Base64本身的一部分。它是末尾的“=”和“==”。Base64将3个字节的数据包编码为4个编码字符。所以如果你的输入数据有长度n和n%3=1=>"=="末尾用于填充n%

  2. ruby - 匹配大写字母并用后续字母填充,直到一定的字符串长度 - 2

    我有一个驼峰式字符串,例如:JustAString。我想按照以下规则形成长度为4的字符串:抓取所有大写字母;如果超过4个大写字母,只保留前4个;如果少于4个大写字母,则将最后大写字母后的字母大写并添加字母,直到长度变为4。以下是可能发生的3种情况:ThisIsMyString将产生TIMS(大写字母);ThisIsOneVeryLongString将产生TIOV(前4个大写字母);MyString将生成MSTR(大写字母+tr大写)。我设法用这个片段解决了前两种情况:str.scan(/[A-Z]/).first(4).join但是,我不太确定如何最好地修改上面的代码片段以处理最后一种

  3. spring.profiles.active和spring.profiles.include的使用及区别说明 - 2

    转自:spring.profiles.active和spring.profiles.include的使用及区别说明下文笔者讲述spring.profiles.active和spring.profiles.include的区别简介说明,如下所示我们都知道,在日常开发中,开发|测试|生产环境都拥有不同的配置信息如:jdbc地址、ip、端口等此时为了避免每次都修改全部信息,我们则可以采用以上的属性处理此类异常spring.profiles.active属性例:配置文件,可使用以下方式定义application-${profile}.properties开发环境配置文件:application-dev

  4. ruby - 如何用递增的值填充数组 Ruby - 2

    我正在尝试解决http://projecteuler.net/problem=1.我想创建一个方法,它接受一个整数,然后创建一个包含它前面的所有整数的数组,并将整数本身作为数组中的值。以下是我目前所拥有的。代码不起作用。defmake_array(num)numbers=Array.newnumcount=1numbers.eachdo|number|numbers 最佳答案 (1..num).to_a是您在Ruby中需要做的全部。1..num将创建一个Range对象,以1开始并以任意值num结束是。Range对象有to_a方法通过

  5. ruby-on-rails - RoR中是否有任何内置方法可以为整数填充零? - 2

    如果我想要“00001”而不是“1”,除了我自己写填零方法之外,有没有内置的方法可以帮助我为整数填零? 最佳答案 puts"%05d"%1#00001参见:String::%,Kernel::sprintf这是正在发生的事情。%左侧的"%05d"是C风格的格式说明符。%右边的变量就是要格式化的东西。格式说明符可以像这样解码:%-格式说明符的开头0-用前导零填充5-长度为5个字符d-被格式化的是一个整数如果你要格式化多个东西,你会把它们放在一个数组中:"%d-%s"%[1,"One"]#=>1-one

  6. ruby-on-rails - ActiveRecord:除非另有说明,否则在保存之前使所有文本字段都调用 strip - 2

    多年来,我在各种网站上遇到过各种问题,用户在字符串和文本字段的开头/结尾放置空格。有时这些会导致格式/布局问题,有时会导致搜索问题(即搜索顺序看起来不对,但实际上并非如此),有时它们实际上会使应用程序崩溃。我认为这会很有用,而不是像我过去所做的那样放入一堆before_save回调,向ActiveRecord添加一些功能以在保存之前自动调用任何字符串/文本字段上的.strip,除非我告诉它不是,例如do_not_strip:field_x,:field_y或类定义顶部的类似内容。在我去弄清楚如何做到这一点之前,有没有人看到更好的解决方案?明确一点,我已经知道我可以做到这一点:befor

  7. ruby-on-rails - 用一系列时间增量填充选择,加上其他选项 - 2

    使用RubyonRails,我使用给定的增量(例如每30分钟)用时间填充“选择”。目前我正在YAML文件中写出所有的可能性,但我觉得有一种更巧妙的方法。我想我想提供一个开始时间、一个结束时间、一个增量,并且目前只提供一个名为“关闭”的选项(想想“business_hours”)。所以,我的选择可能会显示:'Closed'5:00am5:30am6:00am...[allthewayto]...11:30pm谁能想出更好的方法,或者只是将它们全部“拼写”出来的最佳方法? 最佳答案 此答案基于@emh的答案。defcreate_hour

  8. ruby - 如何从 Chef 说明书中的库访问当前节点? - 2

    我正在尝试为ChefRecipe编写一个库,以简化一些常见的搜索。例如,我希望能够在cookbook/libraries/library.rb中执行类似的操作,然后从同一Recipe中的Recipe中使用它:moduleExampledefself.search_attribute(attribute_name)returnsearch(:nodes,node[attribute_name])endend问题是,在Chef库文件中,node对象或search函数都不可用。似乎可以使用Chef::Search::Query.new().search(...)进行搜索,但我找不到任何可以访

  9. ruby-on-rails - 将没有默认值的 NOT NULL 字段添加到填充的数据库中 - 2

    我有一个表,我们称它为MyTable。它是Postgresql数据库的一部分。MyTable中有很多条目,比方说超过一百万。我想向该表中添加一个字段,我们将其命名为MyNewField。它由ActiveRecord迁移添加。此字段没有默认值且不可为空。结果,在它的迁移类中将是这样的:classAddMyFieldToMyTable但是,它会触发一个错误(PG::NotNullViolation),因为该表已经包含行,所有这些行的MyField都设置为NULL。我想做的是:添加没有默认值且可空设置为false的行(不触发PG::NotNullViolation)。然后,将另一个表中的值插

  10. ruby-on-rails - 如何按照散列中的数字序列生成和填充缺失数据 - 2

    我正在尝试创建一个函数来完成以下哈希中的小时序列。{name:"cardio",data:[["06:00",999],["09:00",154],["10:00",1059],["11:00",90]]}它应该在字段数据中创建所有缺失值["07:00",0],["08:00",0],["12:00",0],["13:00",0]...["23:00",0]预期结果:{name:"cardio",data:[["06:00",999],["07:00",0],["08:00",0],["09:00",154],["10:00",1059],["11:00",90]],["12:00",

随机推荐