我可以删除Mongoid中的嵌入文档而不会持久存在吗?

时间:2014-05-16 00:58:25

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

绝对与this question有关,但由于没有明确答案,我觉得我应该再问一次。是否有任何方法从Mongoid embeds_many关系中删除嵌入文档而不保留?

我想修改内存中嵌入文档的数组 - 然后使用单个UPDATE操作保留所有更改。具体来说,我想:

  1. 修改嵌入文档的数组(添加嵌入式文档/删除嵌入式文档/编辑嵌入式文档/等)。
  2. 可能会对TLD进行其他更改。
  3. 通过单个数据库调用保留所有更改。

3 个答案:

答案 0 :(得分:2)

可以使用Mongoid删除嵌入的文档而无需保存。诀窍是使用assign_attributes从父对象进行更改。例如:

class MyParent
  include Mongoid::Document

  field :name, type: String
  embeds_many :my_children

  def remove_my_child(child)
    assign_attributes(my_children: my_children.select { |c| c != child })
  end
end

class MyChild
  include Mongoid::Document

  embedded_in :my_parent

  def remove
    parent.remove_my_child(self)
  end
end

my_parent = MyParent.first
my_first_child = my_parent.my_children.first

# no mongo queries are executed
my_first_child.remove

# now we can make another change with no query executed
my_parent.name = 'foo'

# and finally we can save the whole thing in one query which is the
# reason we used an embedded document in the first place, right?
my_parent.save!

答案 1 :(得分:0)

经过两年多次使用Mongoid之后,我已经了解到那里没有我想要实现的操作符。使用Mongoid删除嵌入的文档总是会导致数据库调用。

在这种情况下,绕过Mongoid并直接使用mongo-ruby-driver更容易。

答案 2 :(得分:-1)

尝试mongoid的

update_all()

Documentation

Ex:如果我想让所有用户都为Joe

User.update_all(name: 'Joe')

将完全按照您的预期行事。