<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
  <channel>
    <title>Ruby China 社区 MongoDB 节点</title>
    <link>https://ruby-china.org/</link>
    <description>Ruby China 社区 MongoDB 节点最新发帖。</description>
    <item>
      <title>可以在一个 document 内的数组排序吗？</title>
      <description>&lt;p&gt;一个 docment 内部有数组，然后对其按照某个字段排序，可以直接使用 mongodb 来实现吗，不想用外部的编程语言实现&lt;/p&gt;</description>
      <author>lihaibo</author>
      <pubDate>Fri, 11 Sep 2020 10:15:56 +0800</pubDate>
      <link>https://ruby-china.org/topics/40395</link>
      <guid>https://ruby-china.org/topics/40395</guid>
    </item>
    <item>
      <title>设置 auth 之后，数据丢失</title>
      <description>&lt;p&gt;之前 mongo 没有开启 auth，现在想打开。但是开启后数据都丢失了。&lt;/p&gt;

&lt;p&gt;最开始的
&lt;strong&gt;docker-compose.yml&lt;/strong&gt;&lt;/p&gt;
&lt;pre class="highlight ruby"&gt;&lt;code&gt;&lt;span class="ss"&gt;mongo:
    image: &lt;/span&gt;&lt;span class="n"&gt;mongo&lt;/span&gt;
    &lt;span class="ss"&gt;volumes:
      &lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;/&lt;/span&gt;&lt;span class="n"&gt;data&lt;/span&gt;&lt;span class="ss"&gt;:/&lt;/span&gt;&lt;span class="n"&gt;data&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;db&lt;/span&gt;
    &lt;span class="ss"&gt;ports:
    &lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="s2"&gt;"27017:27017"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;加上了数据户的账户和密码&lt;/p&gt;
&lt;pre class="highlight ruby"&gt;&lt;code&gt;&lt;span class="ss"&gt;mongo:
    image: &lt;/span&gt;&lt;span class="n"&gt;mongo&lt;/span&gt;
    &lt;span class="ss"&gt;volumes:
      &lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;/&lt;/span&gt;&lt;span class="n"&gt;data&lt;/span&gt;&lt;span class="ss"&gt;:/&lt;/span&gt;&lt;span class="n"&gt;data&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;db&lt;/span&gt;
    &lt;span class="ss"&gt;ports:
    &lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="s2"&gt;"27017:27017"&lt;/span&gt;
    &lt;span class="ss"&gt;environment:
      &lt;/span&gt;&lt;span class="no"&gt;MONGO_INITDB_ROOT_USERNAME&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;admin&lt;/span&gt;
      &lt;span class="no"&gt;MONGO_INITDB_ROOT_PASSWORD&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;password&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;然后 docker-compose up, 发现并没用添加这个用户，因为我的数据库已经存在了，所以继续加上创建用户名和密码的部分&lt;/p&gt;
&lt;pre class="highlight ruby"&gt;&lt;code&gt;&lt;span class="ss"&gt;mongo:
    image: &lt;/span&gt;&lt;span class="n"&gt;mongo&lt;/span&gt;
    &lt;span class="ss"&gt;volumes:
      &lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;/&lt;/span&gt;&lt;span class="n"&gt;data&lt;/span&gt;&lt;span class="ss"&gt;:/&lt;/span&gt;&lt;span class="n"&gt;data&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;db&lt;/span&gt;
    &lt;span class="ss"&gt;ports:
    &lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="s2"&gt;"27017:27017"&lt;/span&gt;
    &lt;span class="ss"&gt;environment:
      &lt;/span&gt;&lt;span class="no"&gt;MONGO_INITDB_ROOT_USERNAME&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;admin&lt;/span&gt;
      &lt;span class="no"&gt;MONGO_INITDB_ROOT_PASSWORD&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;password&lt;/span&gt;
    &lt;span class="ss"&gt;volumes:
      &lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;/&lt;/span&gt;&lt;span class="n"&gt;mongo&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;init&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;js&lt;/span&gt;&lt;span class="ss"&gt;:/&lt;/span&gt;&lt;span class="n"&gt;docker&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;entrypoint&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;initdb&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;d&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;mongo&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;init&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;js&lt;/span&gt;&lt;span class="ss"&gt;:ro&lt;/span&gt; 
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;添加一个新的文件 &lt;strong&gt;mongo-init.js&lt;/strong&gt;&lt;/p&gt;
&lt;pre class="highlight ruby"&gt;&lt;code&gt;&lt;span class="n"&gt;use&lt;/span&gt; &lt;span class="n"&gt;admin&lt;/span&gt;
&lt;span class="n"&gt;db&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;createUser&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
  &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="ss"&gt;user: &lt;/span&gt;&lt;span class="s2"&gt;"admin"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="ss"&gt;pwd: &lt;/span&gt;&lt;span class="s2"&gt;"passw0rd"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="ss"&gt;roles: &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="ss"&gt;role: &lt;/span&gt;&lt;span class="s2"&gt;"userAdminAnyDatabase"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="ss"&gt;db: &lt;/span&gt;&lt;span class="s2"&gt;"admin"&lt;/span&gt; &lt;span class="p"&gt;},&lt;/span&gt; &lt;span class="s2"&gt;"readWriteAnyDatabase"&lt;/span&gt; &lt;span class="p"&gt;]&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;就这样 auth 打开了，但是之前的数据库没有了。&lt;/p&gt;

&lt;p&gt;有一个警告&lt;/p&gt;
&lt;pre class="highlight ruby"&gt;&lt;code&gt;&lt;span class="no"&gt;WARNING&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="no"&gt;Service&lt;/span&gt; &lt;span class="s2"&gt;"mongo"&lt;/span&gt; &lt;span class="n"&gt;is&lt;/span&gt; &lt;span class="n"&gt;using&lt;/span&gt; &lt;span class="n"&gt;volume&lt;/span&gt; &lt;span class="s2"&gt;"/data/db"&lt;/span&gt; &lt;span class="n"&gt;from&lt;/span&gt; &lt;span class="n"&gt;the&lt;/span&gt; &lt;span class="n"&gt;previous&lt;/span&gt; &lt;span class="n"&gt;container&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt; &lt;span class="no"&gt;Host&lt;/span&gt; &lt;span class="n"&gt;mapping&lt;/span&gt; &lt;span class="s2"&gt;"/home/xxx/deploy/data"&lt;/span&gt; &lt;span class="n"&gt;has&lt;/span&gt; &lt;span class="n"&gt;no&lt;/span&gt; &lt;span class="no"&gt;Recreating&lt;/span&gt; &lt;span class="n"&gt;deploy_mongo_1&lt;/span&gt; &lt;span class="o"&gt;...&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;PS:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;在我的 mongo-init.js，应该是一直写的 `pwd: "passwr0rd", docker-compose.yml 里面是“password". 但是现在数据库用 docker-compose 里面的密码可以连上。&lt;/li&gt;
&lt;li&gt;我的数据应该是 mount 到了工程目录下的 data 目录，也就是&lt;code&gt;- ./data:/data/db&lt;/code&gt;. 这个目录从来没有动过，是不是 docker-compose up 会覆盖这个目录导致我数据丢失。还是其他的原因。&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;不知道是否能找回我的数据，望高人指点，谢谢了！&lt;/p&gt;</description>
      <author>autumnwolf</author>
      <pubDate>Mon, 08 Apr 2019 11:40:46 +0800</pubDate>
      <link>https://ruby-china.org/topics/38356</link>
      <guid>https://ruby-china.org/topics/38356</guid>
    </item>
    <item>
      <title>mongoid model update 时会查询 has_one 关联属性</title>
      <description>&lt;p&gt;模型&lt;/p&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;User name:string
Profile age:integer

User has_one :profile
Profile belongs_to :user

User.first.update(name: 'xxxx')
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;会触发&lt;/p&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;D, [2018-12-18T12:33:25.612410 #31808] DEBUG -- : MONGODB | localhost:27017 | m_development.find | STARTED | {"find"=&amp;gt;"users", "filter"=&amp;gt;{}, "sort"=&amp;gt;{"_id"=&amp;gt;1}, "limit"=&amp;gt;1, "singleBatch"=&amp;gt;true, "lsid"=&amp;gt;{"id"=&amp;gt;&amp;lt;BSON::Binary:0x70240119236940 type=uuid data=0x72ff27da5b0142c9...&amp;gt;}}
D, [2018-12-18T12:33:25.614074 #31808] DEBUG -- : MONGODB | localhost:27017 | m_development.find | SUCCEEDED | 0.001s
D, [2018-12-18T12:33:25.624208 #31808] DEBUG -- : MONGODB | localhost:27017 | m_development.find | STARTED | {"find"=&amp;gt;"profiles", "filter"=&amp;gt;{"user_id"=&amp;gt;BSON::ObjectId('5c17c80178d1e2347dca77b2')}, "limit"=&amp;gt;1, "singleBatch"=&amp;gt;true, "lsid"=&amp;gt;{"id"=&amp;gt;&amp;lt;BSON::Binary:0x70240119236940 type=uuid data=0x72ff27da5b0142c9...&amp;gt;}}
D, [2018-12-18T12:33:25.624993 #31808] DEBUG -- : MONGODB | localhost:27017 | m_development.find | SUCCEEDED | 0.001s
D, [2018-12-18T12:33:25.626517 #31808] DEBUG -- : MONGODB | localhost:27017 | m_development.update | STARTED | {"update"=&amp;gt;"users", "ordered"=&amp;gt;true, "lsid"=&amp;gt;{"id"=&amp;gt;&amp;lt;BSON::Binary:0x70240119236940 type=uuid data=0x72ff27da5b0142c9...&amp;gt;}, "updates"=&amp;gt;[{"q"=&amp;gt;{"_id"=&amp;gt;BSON::ObjectId('5c17c80178d1e2347dca77b2')}, "u"=&amp;gt;{"$set"=&amp;gt;{"name"=&amp;gt;"xxxx"}}, "multi"=&amp;gt;false, "upsert"...
D, [2018-12-18T12:33:25.627230 #31808] DEBUG -- : MONGODB | localhost:27017 | m_development.update | SUCCEEDED | 0.001s
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;我试了用 ActiveRecord 不会有这样的问题  这块有点搞不懂 为什么要去查询 profiles 呢&lt;/p&gt;</description>
      <author>leebo-github</author>
      <pubDate>Tue, 18 Dec 2018 12:34:06 +0800</pubDate>
      <link>https://ruby-china.org/topics/37911</link>
      <guid>https://ruby-china.org/topics/37911</guid>
    </item>
    <item>
      <title>MongoDB 修改数据库保存位置无法启动？</title>
      <description>&lt;p&gt;环境 ubuntu16.04，项目使用 mongodb，由于数据量较大，想把数据库保存到其他目录，修改如下：&lt;/p&gt;

&lt;p&gt;默认的数据存储目录是/var/lib/mongodb，假设我们的目的路径是/home/mongodb。&lt;/p&gt;

&lt;p&gt;关闭数据库：&lt;/p&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;sudo &lt;/span&gt;service mongod stop
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;在配置文件中将 storage.dbPath 项设置为目的路径，修改后如下：&lt;/p&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="s"&gt;storage：&lt;/span&gt;
  &lt;span class="s"&gt;dbPath&lt;/span&gt;&lt;span class="err"&gt;:&lt;/span&gt; &lt;span class="s"&gt;/home/mongodb&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;将原目录下的文件复制到新目录中：&lt;/p&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;sudo cp&lt;/span&gt; &lt;span class="nt"&gt;-r&lt;/span&gt; /var/lib/mongodb/&lt;span class="k"&gt;*&lt;/span&gt; /home/mongodb/
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;将 mongod.lock 文件删除后启动数据库：&lt;/p&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;sudo rm&lt;/span&gt; /home/mongodb/mongod.lock
&lt;span class="nb"&gt;sudo &lt;/span&gt;service mongod start
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;看起来一切都是那么美好~~~~&lt;/p&gt;

&lt;p&gt;查看启动状态：&lt;/p&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;sudo &lt;/span&gt;service mongod status
&lt;/code&gt;&lt;/pre&gt;&lt;pre class="highlight shell"&gt;&lt;code&gt;● mongod.service - High-performance, schema-free document-oriented database
   Loaded: loaded &lt;span class="o"&gt;(&lt;/span&gt;/lib/systemd/system/mongod.service&lt;span class="p"&gt;;&lt;/span&gt; disabled&lt;span class="p"&gt;;&lt;/span&gt; vendor preset: enabled&lt;span class="o"&gt;)&lt;/span&gt;
   Active: failed &lt;span class="o"&gt;(&lt;/span&gt;Result: exit-code&lt;span class="o"&gt;)&lt;/span&gt; since Tue 2018-03-20 09:35:41 CST&lt;span class="p"&gt;;&lt;/span&gt; 4s ago
     Docs: https://docs.mongodb.org/manual
  Process: 17283 &lt;span class="nv"&gt;ExecStart&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;/usr/bin/mongod &lt;span class="nt"&gt;--config&lt;/span&gt; /etc/mongod.conf &lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;code&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;exited, &lt;span class="nv"&gt;status&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;100&lt;span class="o"&gt;)&lt;/span&gt;
 Main PID: 17283 &lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;code&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;exited, &lt;span class="nv"&gt;status&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;100&lt;span class="o"&gt;)&lt;/span&gt;

Mar 20 09:35:41 smart systemd[1]: Started High-performance, schema-free document-oriented database.
Mar 20 09:35:41 smart systemd[1]: mongod.service: Main process exited, &lt;span class="nv"&gt;code&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;exited, &lt;span class="nv"&gt;status&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;100/n/a
Mar 20 09:35:41 smart systemd[1]: mongod.service: Unit entered failed state.
Mar 20 09:35:41 smart systemd[1]: mongod.service: Failed with result &lt;span class="s1"&gt;'exit-code'&lt;/span&gt;&lt;span class="nb"&gt;.&lt;/span&gt;

&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;那么问题来了，为什么会启动失败呢？
通过查询日志文件得知：&lt;/p&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;Attempted to create a lock file on a read-only directory: /home/mongodb, terminating
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;查看&lt;code&gt;/home/mongodb&lt;/code&gt;的权限&lt;/p&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;drwxr-xr-x 4 root root 4.0K Mar 20 10:55 mongodb
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;这里的文件所属者不正确，&lt;code&gt;mongodb&lt;/code&gt;这个目录的所有者必须是 mongodb，使用以下命令修改&lt;/p&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# /home&lt;/span&gt;
&lt;span class="nb"&gt;sudo chown&lt;/span&gt; &lt;span class="nt"&gt;-R&lt;/span&gt; mongodb:mongodb &lt;span class="k"&gt;*&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;修改后权限为&lt;/p&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;drwxr-xr-x 4 mongodb mongodb 4.0K Mar 20 10:55 mongodb
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;重启服务，大功告成。&lt;/p&gt;</description>
      <author>OrderSun</author>
      <pubDate>Tue, 20 Mar 2018 09:55:26 +0800</pubDate>
      <link>https://ruby-china.org/topics/35268</link>
      <guid>https://ruby-china.org/topics/35268</guid>
    </item>
    <item>
      <title>Mongoid 里 order 和 sort 的区别是啥</title>
      <description>&lt;p&gt;Mongoid 既可以&lt;/p&gt;
&lt;pre class="highlight ruby"&gt;&lt;code&gt;&lt;span class="no"&gt;Book&lt;/span&gt;&lt;span class="o"&gt;..&lt;/span&gt;&lt;span class="n"&gt;where&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="ss"&gt;author: &lt;/span&gt;&lt;span class="s2"&gt;"Stephen King"&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;order&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="ss"&gt;created_at: :desc&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;也可以&lt;/p&gt;
&lt;pre class="highlight ruby"&gt;&lt;code&gt;&lt;span class="no"&gt;Book&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;where&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="ss"&gt;author: &lt;/span&gt;&lt;span class="s2"&gt;"Stephen King"&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;sort&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;&lt;span class="s2"&gt;"created_at"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;})&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;请问 order 和 sort 的区别是啥
谢啦先&lt;/p&gt;</description>
      <author>birbird</author>
      <pubDate>Sun, 05 Nov 2017 11:07:38 +0800</pubDate>
      <link>https://ruby-china.org/topics/34512</link>
      <guid>https://ruby-china.org/topics/34512</guid>
    </item>
    <item>
      <title>关于 MongoId 里使用 DBRef</title>
      <description>&lt;p&gt;比如一个用户下有多篇文章，文章分开存，用户用 DBRef 来引用文章&lt;/p&gt;

&lt;p&gt;在 Mongo 控制台直接操作可以&lt;/p&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="c1"&gt;//user是一个已经找到的用户&lt;/span&gt;
&lt;span class="nx"&gt;user&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;articles&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;].&lt;/span&gt;&lt;span class="nf"&gt;fetch&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;在 MongoId 里，得到的就是一个 DBRef 对象，看了一下 methods，貌似没有可以直接取得对象的方法，难道还要这样做？&lt;/p&gt;
&lt;pre class="highlight ruby"&gt;&lt;code&gt;&lt;span class="no"&gt;Article&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;find&lt;/span&gt; &lt;span class="n"&gt;user&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;articles&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;].&lt;/span&gt;&lt;span class="nf"&gt;id&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;</description>
      <author>milk</author>
      <pubDate>Tue, 12 Sep 2017 16:19:44 +0800</pubDate>
      <link>https://ruby-china.org/topics/34096</link>
      <guid>https://ruby-china.org/topics/34096</guid>
    </item>
    <item>
      <title>carrierwave-mongoid 的数据，找不到了</title>
      <description>&lt;p&gt;我在一个项目中使用 carrierwave-mongoid，作为附件管理的工具&lt;/p&gt;

&lt;p&gt;在 mongodb 中，没有发现存储的相关信息在什么地方&lt;/p&gt;

&lt;p&gt;dump 了 mongodb 的数据库，到新的数据库中进行 restore&lt;/p&gt;

&lt;p&gt;原来的 picture_url，就不工作了，返回的都是 nil&lt;/p&gt;

&lt;p&gt;请问应该如何处理？&lt;/p&gt;</description>
      <author>lukefan</author>
      <pubDate>Tue, 18 Jul 2017 17:31:26 +0800</pubDate>
      <link>https://ruby-china.org/topics/33546</link>
      <guid>https://ruby-china.org/topics/33546</guid>
    </item>
    <item>
      <title>请教大家 1.12.x 版本中，报 NameError: uninitialized constant MongoReplicaSetClient</title>
      <description>&lt;p&gt;之前项目中用的是 1.12.3 版本的 mongo  gem，后来升级 mongo gem 后发现之前版本的链接方式都换了，想再退回到 1.12.3 版本的 GEM
但使用副本集的时候&lt;/p&gt;
&lt;pre class="highlight ruby"&gt;&lt;code&gt;&lt;span class="n"&gt;client&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="no"&gt;MongoReplicaSetClient&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;new&lt;/span&gt;&lt;span class="p"&gt;([&lt;/span&gt;&lt;span class="s1"&gt;'123.57.xxx.xxx:30000'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'123.56.xxx.xxx:30000'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'101.201.xxx.xxx:30000'&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;链接时报&lt;img title=":sob:" alt="😭" src="https://twemoji.ruby-china.com/2/svg/1f62d.svg" class="twemoji"&gt; &lt;/p&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;NameError: uninitialized constant MongoReplicaSetClient
    from &lt;span class="o"&gt;(&lt;/span&gt;irb&lt;span class="o"&gt;)&lt;/span&gt;:3
    from /home/haonan/.rvm/gems/ruby-2.1.4/gems/railties-4.2.3/lib/rails/commands/console.rb:110:in &lt;span class="sb"&gt;`&lt;/span&gt;start&lt;span class="s1"&gt;'
    from /home/haonan/.rvm/gems/ruby-2.1.4/gems/railties-4.2.3/lib/rails/commands/console.rb:9:in `start'&lt;/span&gt;
    from /home/haonan/.rvm/gems/ruby-2.1.4/gems/railties-4.2.3/lib/rails/commands/commands_tasks.rb:68:in &lt;span class="sb"&gt;`&lt;/span&gt;console&lt;span class="s1"&gt;'
    from /home/haonan/.rvm/gems/ruby-2.1.4/gems/railties-4.2.3/lib/rails/commands/commands_tasks.rb:39:in `run_command!'&lt;/span&gt;
    from /home/haonan/.rvm/gems/ruby-2.1.4/gems/railties-4.2.3/lib/rails/commands.rb:17:in &lt;span class="sb"&gt;`&lt;/span&gt;&amp;lt;top &lt;span class="o"&gt;(&lt;/span&gt;required&lt;span class="o"&gt;)&amp;gt;&lt;/span&gt;&lt;span class="s1"&gt;'
    from bin/rails:4:in `require'&lt;/span&gt;
    from bin/rails:4:in &lt;span class="sb"&gt;`&lt;/span&gt;&amp;lt;main&amp;gt;&lt;span class="s1"&gt;'

&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;网上各种查，没找到好的办法，请假大家了&lt;img title=":pray:" alt="🙏" src="https://twemoji.ruby-china.com/2/svg/1f64f.svg" class="twemoji"&gt; &lt;/p&gt;</description>
      <author>ghn645568344</author>
      <pubDate>Mon, 19 Dec 2016 14:23:38 +0800</pubDate>
      <link>https://ruby-china.org/topics/31932</link>
      <guid>https://ruby-china.org/topics/31932</guid>
    </item>
    <item>
      <title>如何跳过 after_save 等回调方法？</title>
      <description>&lt;p&gt;在我代码初始化数据的时候，我不希望他执行回调，因为这样执行效率比较慢，我希望初始化完毕后，统一执行以下回调。但是查阅了一些 rails 跳过回调的文档，提供的方法 mongodb 没法识别，mongodb 官方文档也没有跳过回调的说明，求助大神们，怎么操作可以跳过回调？&lt;/p&gt;

&lt;p&gt;项目是 rails4.6+mongodb&lt;/p&gt;

&lt;p&gt;我参考过的文章：
&lt;a href="https://docs.mongodb.com/ecosystem/tutorial/mongoid-callbacks/" rel="nofollow" target="_blank"&gt;https://docs.mongodb.com/ecosystem/tutorial/mongoid-callbacks/&lt;/a&gt;
&lt;a href="http://guides.ruby-china.org/active_record_callbacks.html" rel="nofollow" target="_blank"&gt;http://guides.ruby-china.org/active_record_callbacks.html&lt;/a&gt;&lt;/p&gt;</description>
      <author>lehug</author>
      <pubDate>Sun, 10 Jul 2016 15:43:14 +0800</pubDate>
      <link>https://ruby-china.org/topics/30489</link>
      <guid>https://ruby-china.org/topics/30489</guid>
    </item>
    <item>
      <title>MongoDB 集群的几点疑惑</title>
      <description>&lt;p&gt;环境介绍：
MongoDB version 2.6.6  Centos
三个分片集群。&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;问题 1：我通过 mongos 这台路由机器把数据 dump 出来，然后执行 db.collection.remove({})。执行完成之后，登陆 mongos，发现备份的数据库占用空间还是原来的大小（33G），但是里面的数据没有了。有人能帮忙解释下吗？&lt;/li&gt;
&lt;li&gt;问题 2：有人说 MongoDB，只删除数据，不删除数据文件，以便后期使用。如果我执行数据导入操作，导入我之前备份的数据，磁盘空间占用会变成 66G 吗？如果我想把文件也删掉怎么操作，会有什么影响吗？&lt;/li&gt;
&lt;/ul&gt;</description>
      <author>frank</author>
      <pubDate>Fri, 15 Jan 2016 11:09:02 +0800</pubDate>
      <link>https://ruby-china.org/topics/28739</link>
      <guid>https://ruby-china.org/topics/28739</guid>
    </item>
    <item>
      <title>MongoDB 配置 iptables 限制 ip 访问造成访问不稳定</title>
      <description>&lt;p&gt;我的服务器部署在阿里云上，系统是 Ubuntu Server 14.04，iptables 配置项如下（用的教程是&lt;a href="http://blog.csdn.net/pang040328/article/details/19047573" rel="nofollow" target="_blank"&gt;http://blog.csdn.net/pang040328/article/details/19047573&lt;/a&gt;）：&lt;/p&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;sudo &lt;/span&gt;iptables &lt;span class="nt"&gt;-I&lt;/span&gt; INPUT &lt;span class="nt"&gt;-p&lt;/span&gt; tcp &lt;span class="nt"&gt;--dport&lt;/span&gt; 27017 &lt;span class="nt"&gt;-j&lt;/span&gt; DROP
&lt;span class="nb"&gt;sudo &lt;/span&gt;iptables &lt;span class="nt"&gt;-I&lt;/span&gt; INPUT &lt;span class="nt"&gt;-s&lt;/span&gt; 127.0.0.1 &lt;span class="nt"&gt;-p&lt;/span&gt; tcp &lt;span class="nt"&gt;--dport&lt;/span&gt; 27017 &lt;span class="nt"&gt;-j&lt;/span&gt; ACCEPT
&lt;span class="nb"&gt;sudo &lt;/span&gt;iptables &lt;span class="nt"&gt;-I&lt;/span&gt; INPUT &lt;span class="nt"&gt;-s&lt;/span&gt; &amp;lt;my-server-ip&amp;gt; &lt;span class="nt"&gt;-p&lt;/span&gt; tcp &lt;span class="nt"&gt;--dport&lt;/span&gt; 27017 &lt;span class="nt"&gt;-j&lt;/span&gt; ACCEPT
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;结果造成数据库访问不稳定，有时访问出错，有时会访问速度较慢。&lt;/p&gt;

&lt;p&gt;why？&lt;/p&gt;</description>
      <author>mingmingpao</author>
      <pubDate>Mon, 06 Jul 2015 18:58:14 +0800</pubDate>
      <link>https://ruby-china.org/topics/26344</link>
      <guid>https://ruby-china.org/topics/26344</guid>
    </item>
    <item>
      <title>Mongoid 中的 callback 陷阱</title>
      <description>&lt;p&gt;在 save 一个实例时，返回了 false，但查看 errors 却是空的，也就是说 validate 都通过了，但却没有保存成功。于是调用了 save！方法，报错：&lt;/p&gt;
&lt;pre class="highlight ruby"&gt;&lt;code&gt;&lt;span class="no"&gt;Mongoid&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="no"&gt;Errors&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="no"&gt;Callback&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; 
&lt;span class="no"&gt;Problem&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
  &lt;span class="no"&gt;Calling&lt;/span&gt; &lt;span class="n"&gt;save!&lt;/span&gt; &lt;span class="n"&gt;on&lt;/span&gt; &lt;span class="no"&gt;User&lt;/span&gt; &lt;span class="n"&gt;resulted&lt;/span&gt; &lt;span class="k"&gt;in&lt;/span&gt; &lt;span class="n"&gt;a&lt;/span&gt; &lt;span class="kp"&gt;false&lt;/span&gt; &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;from&lt;/span&gt; &lt;span class="n"&gt;a&lt;/span&gt; &lt;span class="n"&gt;callback&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;
&lt;span class="no"&gt;Summary&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
  &lt;span class="no"&gt;If&lt;/span&gt; &lt;span class="n"&gt;a&lt;/span&gt; &lt;span class="n"&gt;before&lt;/span&gt; &lt;span class="n"&gt;callback&lt;/span&gt; &lt;span class="n"&gt;returns&lt;/span&gt; &lt;span class="kp"&gt;false&lt;/span&gt; &lt;span class="k"&gt;when&lt;/span&gt; &lt;span class="n"&gt;using&lt;/span&gt; &lt;span class="no"&gt;Document&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;create!&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="no"&gt;Document&lt;/span&gt;&lt;span class="c1"&gt;#save!, or Documnet#update_attributes! this error will get raised since the document did not actually get saved.&lt;/span&gt;
&lt;span class="no"&gt;Resolution&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
  &lt;span class="no"&gt;Double&lt;/span&gt; &lt;span class="n"&gt;check&lt;/span&gt; &lt;span class="n"&gt;all&lt;/span&gt; &lt;span class="n"&gt;before&lt;/span&gt; &lt;span class="n"&gt;callbacks&lt;/span&gt; &lt;span class="n"&gt;to&lt;/span&gt; &lt;span class="n"&gt;make&lt;/span&gt; &lt;span class="n"&gt;sure&lt;/span&gt; &lt;span class="n"&gt;they&lt;/span&gt; &lt;span class="n"&gt;are&lt;/span&gt; &lt;span class="ow"&gt;not&lt;/span&gt; &lt;span class="n"&gt;unintentionally&lt;/span&gt; &lt;span class="n"&gt;returning&lt;/span&gt; &lt;span class="kp"&gt;false&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;
    &lt;span class="nf"&gt;from&lt;/span&gt; &lt;span class="sr"&gt;/Users/&lt;/span&gt;&lt;span class="n"&gt;cinic&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;rvm&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;gems&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;ruby&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mf"&gt;2.1&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="mi"&gt;4&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;gems&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;mongoid&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mf"&gt;4.0&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;lib&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;mongoid&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;persistable&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;rb&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;93&lt;/span&gt;&lt;span class="ss"&gt;:in&lt;/span&gt; &lt;span class="sb"&gt;`fail_due_to_callback!'
    from /Users/cinic/.rvm/gems/ruby-2.1.4/gems/mongoid-4.0.0/lib/mongoid/persistable/savable.rb:46:in `&lt;/span&gt;&lt;span class="n"&gt;save!&lt;/span&gt;&lt;span class="s1"&gt;'
    from (irb):6
    from /Users/cinic/.rvm/gems/ruby-2.1.4/gems/railties-4.1.7/lib/rails/commands/console.rb:90:in `start'&lt;/span&gt;
    &lt;span class="n"&gt;from&lt;/span&gt; &lt;span class="sr"&gt;/Users/&lt;/span&gt;&lt;span class="n"&gt;cinic&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;rvm&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;gems&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;ruby&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mf"&gt;2.1&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="mi"&gt;4&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;gems&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;railties&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mf"&gt;4.1&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="mi"&gt;7&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;lib&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;rails&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;commands&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;rb&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;9&lt;/span&gt;&lt;span class="ss"&gt;:in&lt;/span&gt; &lt;span class="sb"&gt;`start'
    from /Users/cinic/.rvm/gems/ruby-2.1.4/gems/railties-4.1.7/lib/rails/commands/commands_tasks.rb:69:in `&lt;/span&gt;&lt;span class="n"&gt;console&lt;/span&gt;&lt;span class="s1"&gt;'
    from /Users/cinic/.rvm/gems/ruby-2.1.4/gems/railties-4.1.7/lib/rails/commands/commands_tasks.rb:40:in `run_command!'&lt;/span&gt;
    &lt;span class="n"&gt;from&lt;/span&gt; &lt;span class="sr"&gt;/Users/&lt;/span&gt;&lt;span class="n"&gt;cinic&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;rvm&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;gems&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;ruby&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mf"&gt;2.1&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="mi"&gt;4&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;gems&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;railties&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mf"&gt;4.1&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="mi"&gt;7&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;lib&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;rails&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;commands&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;rb&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;17&lt;/span&gt;&lt;span class="ss"&gt;:in&lt;/span&gt; &lt;span class="sb"&gt;`&amp;lt;top (required)&amp;gt;'
    from bin/rails:4:in `&lt;/span&gt;&lt;span class="nb"&gt;require&lt;/span&gt;&lt;span class="s1"&gt;'
    from bin/rails:4:in `&amp;lt;main&amp;gt;'&lt;/span&gt;

&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;根据报错信息，又去类里查看了所以的 callback 方法，其实只有一个 before_save：&lt;/p&gt;
&lt;pre class="highlight ruby"&gt;&lt;code&gt;&lt;span class="nb"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;is_member&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;point&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt; &lt;span class="p"&gt;?&lt;/span&gt; &lt;span class="kp"&gt;true&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kp"&gt;false&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;就是检查某个值大于 0 时，将另一个值设为 true，否则为 false。问题就在这里，因为有可能是返回的 false，所以导致这个 callback 最后的返回值也是 false，最后解决是在这个方法最后加上 return true。有没有碰到过这样问题的，这算是个 Bug 吗？&lt;/p&gt;

&lt;p&gt;Mongoid 的文档中有这样说：&lt;/p&gt;
&lt;pre class="highlight ruby"&gt;&lt;code&gt;&lt;span class="no"&gt;Using&lt;/span&gt; &lt;span class="n"&gt;callbacks&lt;/span&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;domain&lt;/span&gt; &lt;span class="n"&gt;logic&lt;/span&gt; &lt;span class="n"&gt;is&lt;/span&gt; &lt;span class="n"&gt;a&lt;/span&gt; &lt;span class="n"&gt;bad&lt;/span&gt; &lt;span class="n"&gt;design&lt;/span&gt; &lt;span class="n"&gt;practice&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="ow"&gt;and&lt;/span&gt; &lt;span class="n"&gt;can&lt;/span&gt; &lt;span class="n"&gt;lead&lt;/span&gt; &lt;span class="n"&gt;to&lt;/span&gt; &lt;span class="n"&gt;unexpected&lt;/span&gt; &lt;span class="n"&gt;errors&lt;/span&gt; &lt;span class="n"&gt;that&lt;/span&gt; &lt;span class="n"&gt;are&lt;/span&gt; &lt;span class="n"&gt;hard&lt;/span&gt; &lt;span class="n"&gt;to&lt;/span&gt; &lt;span class="n"&gt;debug&lt;/span&gt; &lt;span class="k"&gt;when&lt;/span&gt; &lt;span class="n"&gt;callbacks&lt;/span&gt; &lt;span class="k"&gt;in&lt;/span&gt; &lt;span class="n"&gt;the&lt;/span&gt; &lt;span class="n"&gt;chain&lt;/span&gt; &lt;span class="n"&gt;halt&lt;/span&gt; &lt;span class="n"&gt;execution&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt; &lt;span class="no"&gt;It&lt;/span&gt; &lt;span class="n"&gt;is&lt;/span&gt; &lt;span class="n"&gt;our&lt;/span&gt; &lt;span class="n"&gt;recommendation&lt;/span&gt; &lt;span class="n"&gt;to&lt;/span&gt; &lt;span class="n"&gt;only&lt;/span&gt; &lt;span class="n"&gt;use&lt;/span&gt; &lt;span class="n"&gt;them&lt;/span&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;cross&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;cutting&lt;/span&gt; &lt;span class="n"&gt;concerns&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;like&lt;/span&gt; &lt;span class="n"&gt;queueing&lt;/span&gt; &lt;span class="n"&gt;up&lt;/span&gt; &lt;span class="n"&gt;background&lt;/span&gt; &lt;span class="n"&gt;jobs&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;是不是不应该这么用 callback 呢？&lt;/p&gt;</description>
      <author>cinic</author>
      <pubDate>Mon, 04 May 2015 15:45:29 +0800</pubDate>
      <link>https://ruby-china.org/topics/25421</link>
      <guid>https://ruby-china.org/topics/25421</guid>
    </item>
    <item>
      <title>Mongoid 如何与 elasticsearch 很好的集成?</title>
      <description>&lt;p&gt;我想用 elasticsearch-model 与 elasticsearch 整合，结果与 mongoid 进行整合不大顺利。&lt;/p&gt;

&lt;p&gt;我尝试了下与 ActiveRecord 的整合，很顺利。&lt;/p&gt;

&lt;p&gt;&lt;a href="http://www.elastic.co/guide/en/elasticsearch/client/ruby-api/current/_activemodel_activerecord.html" rel="nofollow" target="_blank"&gt;http://www.elastic.co/guide/en/elasticsearch/client/ruby-api/current/_activemodel_activerecord.html&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;上面按个地址的入门教程直接就顺利通过了。&lt;/p&gt;

&lt;p&gt;但是改成 mongoid 之后，不行。我进去 elasticsearch-model 的 github 主页，看到 gemfiles 这个文件夹的 commit 信息显示如下：&lt;/p&gt;

&lt;p&gt;Bundler could not find compatible versions for gem "minitest":
  In Gemfile:
    mongoid (= 4.0.0) ruby depends on
      activemodel (~&amp;gt; 4.0) ruby depends on
        activesupport (= 4.0.0) ruby depends on
          minitest (~&amp;gt; 4.2) ruby&lt;/p&gt;

&lt;p&gt;minitest (4.0.0)&lt;/p&gt;

&lt;p&gt;我无法得知如何更改，而且我也无法得知是否是因为这个出错误了。&lt;/p&gt;</description>
      <author>mingmingpao</author>
      <pubDate>Mon, 13 Apr 2015 12:34:01 +0800</pubDate>
      <link>https://ruby-china.org/topics/25118</link>
      <guid>https://ruby-china.org/topics/25118</guid>
    </item>
    <item>
      <title>Mongoid 中只设置 belongs_to 忽略 has_many 会有严重问题吗?</title>
      <description>&lt;p&gt;看文档中有这么一句&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Definitions are required on both sides to the relation in order for it to work properly, unless one of the models is embedded. &lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;如果我忽略 has_many 会怎样？因为不需要从 one 端获取 many 端&lt;/p&gt;</description>
      <author>mingmingpao</author>
      <pubDate>Thu, 09 Apr 2015 16:26:44 +0800</pubDate>
      <link>https://ruby-china.org/topics/25072</link>
      <guid>https://ruby-china.org/topics/25072</guid>
    </item>
    <item>
      <title>Mongoid 中 attr_protected 错误: NoMethodError: undefined method `attr_protected' for User:Class</title>
      <description>&lt;p&gt;现在用 Mongoid4.0 了，配置&lt;/p&gt;
&lt;pre class="highlight ruby"&gt;&lt;code&gt;&lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;User&lt;/span&gt;
    &lt;span class="kp"&gt;include&lt;/span&gt; &lt;span class="no"&gt;Mongoid&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="no"&gt;Document&lt;/span&gt;
    &lt;span class="n"&gt;field&lt;/span&gt; &lt;span class="ss"&gt;:first_name&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="ss"&gt;type: &lt;/span&gt;&lt;span class="no"&gt;String&lt;/span&gt;
    &lt;span class="n"&gt;field&lt;/span&gt; &lt;span class="ss"&gt;:password&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="ss"&gt;type: &lt;/span&gt;&lt;span class="no"&gt;String&lt;/span&gt;
    &lt;span class="n"&gt;attr_protected&lt;/span&gt; &lt;span class="ss"&gt;:password&lt;/span&gt; &lt;span class="c1"&gt;# focus this&lt;/span&gt;
&lt;span class="k"&gt;end&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;出现了标题的错误。我想要在 model 层禁止更新密码，思路来源于
&lt;a href="http://mongoid.org/en/mongoid/docs/documents.html#security" rel="nofollow" target="_blank"&gt;http://mongoid.org/en/mongoid/docs/documents.html#security&lt;/a&gt;&lt;/p&gt;</description>
      <author>mingmingpao</author>
      <pubDate>Thu, 09 Apr 2015 16:23:58 +0800</pubDate>
      <link>https://ruby-china.org/topics/25071</link>
      <guid>https://ruby-china.org/topics/25071</guid>
    </item>
    <item>
      <title>【已解决】mongoid 实现 group by 问题</title>
      <description>&lt;p&gt;我参考这篇文章：&lt;a href="http://www.dixis.com/?p=531" rel="nofollow" target="_blank"&gt;http://www.dixis.com/?p=531&lt;/a&gt;
clone 的 rubychina 的源码，打开 console,&lt;/p&gt;

&lt;p&gt;&lt;code&gt;Reply.collection.group(:key =&amp;gt; 'user_id', :initial =&amp;gt; { :count =&amp;gt; 0 }, :reduce =&amp;gt; "function(doc, prev){prev.count += 1;}")&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;没有反应啊，大神们这是怎么回事啊？
mongodb 时启动的，rubychina 可以在本地跑起来。
或者大神门赐教 mongodb 怎么做 group by 比较好。&lt;/p&gt;</description>
      <author>liangbin661831</author>
      <pubDate>Thu, 22 Jan 2015 11:26:48 +0800</pubDate>
      <link>https://ruby-china.org/topics/23875</link>
      <guid>https://ruby-china.org/topics/23875</guid>
    </item>
    <item>
      <title>一个新项目，用 Mongo 还是 SQL DB?</title>
      <description>&lt;p&gt;一个新项目，数据量应该会比较大，不过目前是初创阶段。&lt;/p&gt;

&lt;p&gt;团队目前没有 mongoDB 高手，不过我有信心带领团队把 mongoDB 搞通。&lt;/p&gt;

&lt;p&gt;请问该用熟悉的 sql 数据库还是 mongoDB？&lt;/p&gt;</description>
      <author>gazeldx</author>
      <pubDate>Tue, 16 Dec 2014 15:14:15 +0800</pubDate>
      <link>https://ruby-china.org/topics/23230</link>
      <guid>https://ruby-china.org/topics/23230</guid>
    </item>
    <item>
      <title>让 Mongoid 4.0.0 支持 belongs_to eager load</title>
      <description>&lt;h2 id="mongoid4.0.0去掉了IdentityMap"&gt;mongoid4.0.0 去掉了 IdentityMap&lt;/h2&gt;
&lt;p&gt;原来在 mongoid3 上做的 belongs_to eager_load 不能再用了
 那我们看看 mongoid4.0.0 改如何修改&lt;/p&gt;
&lt;h2 id="模型，假设一张脸有多个左眼和多个右眼吧，懒得改了^^"&gt;模型，假设一张脸有多个左眼和多个右眼吧，懒得改了^^&lt;/h2&gt;&lt;pre class="highlight ruby"&gt;&lt;code&gt;&lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;Face&lt;/span&gt;
  &lt;span class="kp"&gt;include&lt;/span&gt; &lt;span class="no"&gt;Mongoid&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="no"&gt;Document&lt;/span&gt;
  &lt;span class="n"&gt;field&lt;/span&gt; &lt;span class="ss"&gt;:name&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="ss"&gt;type: &lt;/span&gt;&lt;span class="no"&gt;String&lt;/span&gt;
  &lt;span class="n"&gt;has_many&lt;/span&gt; &lt;span class="ss"&gt;:left_eyes&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="ss"&gt;class_name: &lt;/span&gt;&lt;span class="s2"&gt;"Eye"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="ss"&gt;as: :eyeable&lt;/span&gt;
  &lt;span class="n"&gt;has_many&lt;/span&gt; &lt;span class="ss"&gt;:right_eyes&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="ss"&gt;class_name: &lt;/span&gt;&lt;span class="s2"&gt;"Eye"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="ss"&gt;as: :eyeable&lt;/span&gt;
&lt;span class="k"&gt;end&lt;/span&gt;

&lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;Eye&lt;/span&gt;
  &lt;span class="kp"&gt;include&lt;/span&gt; &lt;span class="no"&gt;Mongoid&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="no"&gt;Document&lt;/span&gt;
  &lt;span class="n"&gt;field&lt;/span&gt; &lt;span class="ss"&gt;:name&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="ss"&gt;type: &lt;/span&gt;&lt;span class="no"&gt;String&lt;/span&gt;

  &lt;span class="n"&gt;belongs_to&lt;/span&gt; &lt;span class="ss"&gt;:eyeable&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="ss"&gt;polymorphic: &lt;/span&gt;&lt;span class="kp"&gt;true&lt;/span&gt;
&lt;span class="k"&gt;end&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;h2 id="no eager_load"&gt;no eager_load&lt;/h2&gt;&lt;pre class="highlight ruby"&gt;&lt;code&gt;&lt;span class="n"&gt;faces&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="no"&gt;Face&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;all&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;to_a&lt;/span&gt;
&lt;span class="n"&gt;faces&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;first&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;left_eyes&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;MOPED: 127.0.0.1:27017 QUERY runtime: 0.6560ms&lt;/p&gt;

&lt;p&gt;[
#,
#
] &lt;/p&gt;
&lt;h2 id="has_many: eager_load , 使用 .includes方法"&gt;has_many: eager_load , 使用 .includes 方法&lt;/h2&gt;&lt;pre class="highlight ruby"&gt;&lt;code&gt;&lt;span class="n"&gt;faces&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="no"&gt;Face&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;includes&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="ss"&gt;:left_eyes&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;to_a&lt;/span&gt;
&lt;span class="n"&gt;faces&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;first&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;left_eyes&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;[
#,
#
] &lt;/p&gt;
&lt;h2 id="mongoid 4.0.0 支持has_many的eager_load,但是不支持 belongs_to"&gt;mongoid 4.0.0 支持 has_many 的 eager_load，但是不支持 belongs_to&lt;/h2&gt;
&lt;p&gt;eg:&lt;/p&gt;
&lt;pre class="highlight ruby"&gt;&lt;code&gt;&lt;span class="n"&gt;eyes&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="no"&gt;Eye&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;includes&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="ss"&gt;:eyeable&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;to_a&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;抛出异常
Mongoid::Errors::EagerLoad: 
Problem:
  Eager loading :eyeable is not supported since it is a
  polymorphic belongs_to relation.&lt;/p&gt;

&lt;p&gt;查看原代码，发现当 belongs_to 后面接 polymorphic 参数的时候，会抛出异常&lt;/p&gt;
&lt;pre class="highlight ruby"&gt;&lt;code&gt;&lt;span class="k"&gt;module&lt;/span&gt; &lt;span class="nn"&gt;Mongoid&lt;/span&gt;
  &lt;span class="k"&gt;module&lt;/span&gt; &lt;span class="nn"&gt;Relations&lt;/span&gt;
    &lt;span class="k"&gt;module&lt;/span&gt; &lt;span class="nn"&gt;Eager&lt;/span&gt;
      &lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;BelongsTo&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="no"&gt;Base&lt;/span&gt;
        &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;preload&lt;/span&gt;
           &lt;span class="k"&gt;raise&lt;/span&gt; &lt;span class="no"&gt;Errors&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="no"&gt;EagerLoad&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;new&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="vi"&gt;@metadata.name&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="vi"&gt;@metadata.polymorphic&lt;/span&gt;&lt;span class="p"&gt;?&lt;/span&gt;
           &lt;span class="vi"&gt;@docs.each&lt;/span&gt; &lt;span class="k"&gt;do&lt;/span&gt; &lt;span class="o"&gt;|&lt;/span&gt;&lt;span class="n"&gt;d&lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt;
             &lt;span class="n"&gt;set_relation&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;d&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kp"&gt;nil&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
           &lt;span class="k"&gt;end&lt;/span&gt;

           &lt;span class="n"&gt;each_loaded_document&lt;/span&gt; &lt;span class="k"&gt;do&lt;/span&gt; &lt;span class="o"&gt;|&lt;/span&gt;&lt;span class="n"&gt;doc&lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt;
             &lt;span class="nb"&gt;id&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;doc&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;send&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;key&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
             &lt;span class="n"&gt;set_on_parent&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;id&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;doc&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
           &lt;span class="k"&gt;end&lt;/span&gt;
           &lt;span class="o"&gt;...&lt;/span&gt;
        &lt;span class="k"&gt;end&lt;/span&gt;
      &lt;span class="k"&gt;end&lt;/span&gt;
    &lt;span class="k"&gt;end&lt;/span&gt;
  &lt;span class="k"&gt;end&lt;/span&gt;
&lt;span class="k"&gt;end&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;那我们注意掉这句，看一下会发生什么？
NameError: uninitialized constant Eyeable
问题出在这里 each_loaded_document, &lt;a href="/metadata.klass" class="user-mention" title="@metadata.klass"&gt;&lt;i&gt;@&lt;/i&gt;metadata.klass&lt;/a&gt; ＝&amp;gt; Eyeable
这个 Eyeable 是从哪里来的呢？就是从我们的模型 Eye 中：belongs_to :eyeable
each_loaded_document 这个方法就是 load 依赖的模型数据了&lt;/p&gt;

&lt;p&gt;eyes = Eye.includes(:eyeable).to_a&lt;/p&gt;
&lt;pre class="highlight ruby"&gt;&lt;code&gt;&lt;span class="k"&gt;module&lt;/span&gt; &lt;span class="nn"&gt;Mongoid&lt;/span&gt;
  &lt;span class="k"&gt;module&lt;/span&gt; &lt;span class="nn"&gt;Relations&lt;/span&gt;
    &lt;span class="k"&gt;module&lt;/span&gt; &lt;span class="nn"&gt;Eager&lt;/span&gt;
      &lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;Base&lt;/span&gt;
        &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;each_loaded_document&lt;/span&gt;
          &lt;span class="vi"&gt;@metadata.klass.any_in&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;key&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;keys_from_docs&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;each&lt;/span&gt; &lt;span class="k"&gt;do&lt;/span&gt; &lt;span class="o"&gt;|&lt;/span&gt;&lt;span class="n"&gt;doc&lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt;
            &lt;span class="k"&gt;yield&lt;/span&gt; &lt;span class="n"&gt;doc&lt;/span&gt;
          &lt;span class="k"&gt;end&lt;/span&gt;
        &lt;span class="k"&gt;end&lt;/span&gt;
      &lt;span class="k"&gt;end&lt;/span&gt;
    &lt;span class="k"&gt;end&lt;/span&gt;
  &lt;span class="k"&gt;end&lt;/span&gt;
&lt;span class="k"&gt;end&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;找到需要预加载的 Face，并通过 set_on_parent 与 eye 建立对应关系
&lt;a href="/metadata.klass.any_i" class="user-mention" title="@metadata.klass.any_i"&gt;&lt;i&gt;@&lt;/i&gt;metadata.klass.any_i&lt;/a&gt;n(key =&amp;gt; keys_from_docs) =&amp;gt;
Face.any_in(_id =&amp;gt; ['id1','id2'])&lt;/p&gt;
&lt;pre class="highlight ruby"&gt;&lt;code&gt;&lt;span class="n"&gt;each_loaded_document&lt;/span&gt; &lt;span class="k"&gt;do&lt;/span&gt; &lt;span class="o"&gt;|&lt;/span&gt;&lt;span class="n"&gt;doc&lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt;
   &lt;span class="nb"&gt;id&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;doc&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;send&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;key&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
   &lt;span class="n"&gt;set_on_parent&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;id&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;doc&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="k"&gt;end&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;建立 eye 对象和 face 对象的对应关系
#&lt;a rel="nofollow" target="_blank"&gt;Eye:0x007f837b55b670&lt;/a&gt;, #&lt;a rel="nofollow" target="_blank"&gt;Face:0x007f837b4f2800&lt;/a&gt;
#&lt;a rel="nofollow" target="_blank"&gt;Eye:0x007f837b55b5f8&lt;/a&gt;, #&lt;a rel="nofollow" target="_blank"&gt;Face:0x007f837b4f2800&lt;/a&gt;&lt;/p&gt;
&lt;pre class="highlight ruby"&gt;&lt;code&gt;&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;set_on_parent&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;id&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;element&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
  &lt;span class="n"&gt;grouped_docs&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nb"&gt;id&lt;/span&gt;&lt;span class="p"&gt;].&lt;/span&gt;&lt;span class="nf"&gt;each&lt;/span&gt; &lt;span class="k"&gt;do&lt;/span&gt; &lt;span class="o"&gt;|&lt;/span&gt;&lt;span class="n"&gt;d&lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt;
    &lt;span class="n"&gt;set_relation&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;d&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;element&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
  &lt;span class="k"&gt;end&lt;/span&gt;
&lt;span class="k"&gt;end&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;生成实例变量 &lt;a href="/_eyealbe" class="user-mention" title="@_eyealbe"&gt;&lt;i&gt;@&lt;/i&gt;_eyealbe&lt;/a&gt;,当调用 eyes.first.eyealbe 的时候，则直接返回 face 对象
而不需要再查询数据库
&lt;a href="/_eyeable" class="user-mention" title="@_eyeable"&gt;&lt;i&gt;@&lt;/i&gt;_eyeable&lt;/a&gt;, #&lt;a rel="nofollow" target="_blank"&gt;Face:0x007f837b4f2800&lt;/a&gt;&lt;/p&gt;
&lt;pre class="highlight ruby"&gt;&lt;code&gt;&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;set_relation&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;name&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;relation&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
  &lt;span class="nb"&gt;instance_variable_set&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;"@_&lt;/span&gt;&lt;span class="si"&gt;#{&lt;/span&gt;&lt;span class="nb"&gt;name&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;relation&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="k"&gt;end&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;h2 id="综上，处理belongs_to eager_load的做法："&gt;综上，处理 belongs_to eager_load 的做法：&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;重写 preload 方法，去掉 raise
lib/mongoid/eager_load.rb&lt;/p&gt;
&lt;pre class="highlight ruby"&gt;&lt;code&gt;&lt;span class="k"&gt;module&lt;/span&gt; &lt;span class="nn"&gt;Mongoid&lt;/span&gt;
&lt;span class="k"&gt;module&lt;/span&gt; &lt;span class="nn"&gt;Relations&lt;/span&gt;
&lt;span class="k"&gt;module&lt;/span&gt; &lt;span class="nn"&gt;Eager&lt;/span&gt;
  &lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;BelongsTo&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="no"&gt;Base&lt;/span&gt;
    &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;preload&lt;/span&gt;
       &lt;span class="vi"&gt;@docs.each&lt;/span&gt; &lt;span class="k"&gt;do&lt;/span&gt; &lt;span class="o"&gt;|&lt;/span&gt;&lt;span class="n"&gt;d&lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt;
         &lt;span class="n"&gt;set_relation&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;d&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kp"&gt;nil&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
       &lt;span class="k"&gt;end&lt;/span&gt;

       &lt;span class="n"&gt;each_loaded_document&lt;/span&gt; &lt;span class="k"&gt;do&lt;/span&gt; &lt;span class="o"&gt;|&lt;/span&gt;&lt;span class="n"&gt;doc&lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt;
         &lt;span class="nb"&gt;id&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;doc&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;send&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;key&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
         &lt;span class="n"&gt;set_on_parent&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;id&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;doc&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
       &lt;span class="k"&gt;end&lt;/span&gt;
       &lt;span class="o"&gt;...&lt;/span&gt;
    &lt;span class="k"&gt;end&lt;/span&gt;
  &lt;span class="k"&gt;end&lt;/span&gt;
&lt;span class="k"&gt;end&lt;/span&gt;
&lt;span class="k"&gt;end&lt;/span&gt;
&lt;span class="k"&gt;end&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;加载 initializers/mongoid.rb&lt;/p&gt;
&lt;pre class="highlight ruby"&gt;&lt;code&gt;&lt;span class="nb"&gt;require&lt;/span&gt; &lt;span class="s2"&gt;"mongoid/eager_load"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;在 belongs_to 一端，声明 class_name&lt;/p&gt;
&lt;pre class="highlight ruby"&gt;&lt;code&gt;&lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;Eye&lt;/span&gt;
&lt;span class="kp"&gt;include&lt;/span&gt; &lt;span class="no"&gt;Mongoid&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="no"&gt;Document&lt;/span&gt;
&lt;span class="n"&gt;field&lt;/span&gt; &lt;span class="ss"&gt;:name&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="ss"&gt;type: &lt;/span&gt;&lt;span class="no"&gt;String&lt;/span&gt;
&lt;span class="n"&gt;belongs_to&lt;/span&gt; &lt;span class="ss"&gt;:eyeable&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="ss"&gt;class_name: &lt;/span&gt;&lt;span class="s2"&gt;"Face"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="ss"&gt;polymorphic: &lt;/span&gt;&lt;span class="kp"&gt;true&lt;/span&gt;
&lt;span class="k"&gt;end&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id="测试：belongs_to"&gt;测试：belongs_to&lt;/h2&gt;
&lt;p&gt;2.1.1 :004 &amp;gt; eyes = Eye.all.to_a
2.1.1 :005 &amp;gt; eyes.first.eyeable
  MOPED: 127.0.0.1:27017 QUERY runtime: 0.6910ms
 =&amp;gt; # &lt;/p&gt;

&lt;p&gt;2.1.1 :002 &amp;gt; eyes = Eye.includes(:eyeable).to_a
2.1.1 :003 &amp;gt; eyes.first.eyeable
 =&amp;gt; # &lt;/p&gt;
&lt;h2 id="测试：has_many"&gt;测试：has_many&lt;/h2&gt;
&lt;p&gt;2.1.1 :006 &amp;gt; faces = Face.includes(:left_eyes).to_a
2.1.1 :009 &amp;gt; faces.first.left_eyes
  MOPED: 127.0.0.1:27017 QUERY runtime: 0.7480ms
 =&amp;gt; 
 [
 #, 
 #
 ] &lt;/p&gt;

&lt;p&gt;2.1.1 :006 &amp;gt; faces = Face.includes(:left_eyes).to_a
2.1.1 :007 &amp;gt; faces.first.left_eyes
 =&amp;gt; 
 [
 #, 
 #
 ] &lt;/p&gt;

&lt;p&gt;博客：&lt;a href="http://michael-roshen.iteye.com/blog/2152764" rel="nofollow" target="_blank"&gt;http://michael-roshen.iteye.com/blog/2152764&lt;/a&gt;
微信：ruby 程序员&lt;/p&gt;</description>
      <author>michael_roshen</author>
      <pubDate>Wed, 05 Nov 2014 19:04:13 +0800</pubDate>
      <link>https://ruby-china.org/topics/22508</link>
      <guid>https://ruby-china.org/topics/22508</guid>
    </item>
    <item>
      <title>MongoDB 的备份策略</title>
      <description>&lt;p&gt;用 dump 整个数据库的方式来备份，会完全占满磁盘 IO，基本上 server 就会处于不可用的状态，并且备份出来动辄好几个 G 的数据库文件也不好管理。&lt;/p&gt;

&lt;p&gt;想要使用 MongoDB 的 MMS 服务，增量的 oplog 备份看起来很不错，但是不知道对国内 MongoDB 服务器备份起来，带宽或者其他方面是否有影响。&lt;/p&gt;

&lt;p&gt;所以想要请教大家，你们的 MongoDB 的备份策略是咋做的？&lt;/p&gt;</description>
      <author>iamroody</author>
      <pubDate>Thu, 14 Aug 2014 10:54:27 +0800</pubDate>
      <link>https://ruby-china.org/topics/21018</link>
      <guid>https://ruby-china.org/topics/21018</guid>
    </item>
    <item>
      <title>mongoose 正则匹配</title>
      <description>&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;var&lt;/span&gt; &lt;span class="nx"&gt;regex&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;RegExp&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;sSearch&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;i&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="nx"&gt;User&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;find&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;&lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;regex&lt;/span&gt;&lt;span class="p"&gt;}).&lt;/span&gt;&lt;span class="nf"&gt;exec&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;function &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;err&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;items&lt;/span&gt;&lt;span class="p"&gt;){&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;name 的 type 是 String，这样是可以的；如果换成 age，age 的 type 是 Number，就报类型转换错误  CastError: Cast to number failed for value "/(?:)/i" at path "age"，请问一下，该是怎么样的写法？&lt;/p&gt;</description>
      <author/>
      <pubDate>Tue, 15 Jul 2014 14:20:43 +0800</pubDate>
      <link>https://ruby-china.org/topics/20498</link>
      <guid>https://ruby-china.org/topics/20498</guid>
    </item>
  </channel>
</rss>
