3

我认为 fastmod 指定了一些操作,例如就地更新。在我的应用程序中,我正在使用 '$' 修饰符通过 _id 进行更新,例如:

$colleciton->update(
    array('_id' => $id),
    array(
        '$inc' => array('hits' => new MongoInt32(1)),
        '$set' => array(
                      'times.gen' => gettimeofday(true),
                      'http.code' => new MongoInt32(200)
         )
    ),
    array('safe'=>false,'multiple'=>false,'upsert'=>false)
);

我有这样的日志:

Wed Jul 25 11:08:36 [conn7002912] update mob.stat_pages query: { _id: BinData } update: { $inc: { hits: 1 }, $set: { times.gen: 1343203715.684896, http.code: 200 } } nscanned:1 nupdated:1 keyUpdates:0 locks(micros) w:342973 342ms

如您所见,在日志中我没有任何“fastmod”标志。没有“移动”标志,因为我在插入时设置了字段“times.gen”和“http.code”,所以填充因子为 1.0。

我做错了什么,还是我误解了 fastmod 的含义?

4

1 回答 1

3

您是正确的,日志中的“fastmod”表示就地更新。省略记录的 fastmod/in-place 操作的一些可能原因:

  1. 您实际上是在设置或增加一个不存在的字段,因此必须添加它,而不是就地操作
  2. 日志只显示慢查询(默认 >100 毫秒),因此就地查询可能发生得太快而无法记录
  3. 从日志来看,您似乎使用的是 2.1 或 2.2 - 如果/当您切换到新版本时,这些消息是否消失了?

就进一步研究而言:

查看分析器,尝试使用不同的设置,注意:分析会增加负载 - 因此请谨慎使用。

您也可以尝试将 slowms 值设置得较低,无论是在启动时还是:

> db.setProfilingLevel(0,20) // slow threshold=20ms
于 2012-07-25T12:06:57.247 回答