1

我有一些非常大的文件。由于嵌入和数组字段。一个例子如下:

{
  "_id" => BSON::ObjectId('5654b4b3204528cfa0000001'),
  "rating" => 0,
  "status" => :ok,
  "foo" => '...',
  "bar" => '...',
  # a few fields
  "group_ids" =>  [
    BSON::ObjectId('55ba5d5420452896a8000007'),
    BSON::ObjectId('5602bf4c2045289107000001')
  ],
  "events": [
    {
      "_id" => BSON::ObjectId('5654b4b3204528cfa0000002'),
      "field_a" => '...',
      "field_b" => '...',
    }
    # more than 200 entries
  ]
}

例如,可能有数百个事件并且不超过十个 group_id。对于我的应用程序,我需要一些字段,但我不能返回事件(它很慢)。

在版本 3 Mongoid 中,我过滤了必要的字段,执行了我的操作并更改了其中一些返回的字段:

entry = Model.without(:events).first
# Change some fields, for example:
entry.rating = 3
entry.status = :error

entry.save
# Mongoid 4: raise Mongoid::Errors::ReadonlyDocument

但是 Mongoid 4:“现在使用 #only 或 #without 从标准加载的文档现在在尝试保存时会引发错误”。

我无法使用原子操作来解决它,因为我的模型具有回调(after_save,before_update),这些回调(after_save,before_update)取决于字段(ActiveModel::Dirty)的先前状态,例如status_changed?group_ids_change

他们可以帮助我提出任何建议吗?

4

0 回答 0