【问题标题】:How do you update all embedded documents for a specific column in a table in Mongoid?如何更新 Mongoid 表中特定列的所有嵌入文档?
【发布时间】:2012-04-01 20:43:51
【问题描述】:

目前我有一个address 列,它是我的users 表中的嵌入文档。 address 列包含_id 用于address 表中的相关行。每个user 可以有多个addresses,因此如果该用户有多个地址,则user address 列中可以有多个嵌入文档。

如何删除特定地址id 的所有address 嵌入文档?在我的例子中,当用户删除一个地址时,我想从 users 表中 address 嵌入文档的 ALL 中删除该特定地址。

这在 Rails 控制台中可行吗?

谢谢

【问题讨论】:

    标签: ruby-on-rails mongodb mongoid


    【解决方案1】:

    你可以这样做:

    User.where('addresses.id' => address.id).each do |u|
      u.addresses.where(:id => address.id).delete
      u.save
    end
    

    【讨论】:

    • 这不起作用。它没有找到它,所以返回 nil。我什至尝试过User.where('addresses.id' => address.id).first,它返回 nil。
    • 如何从用户那里获得地址?
    【解决方案2】:

    你也可以这样做:

    while User.where('addresses._id' => address.id).count > 0
      User.collection.update({'addresses._id' => address.id},
          {'$pull' => { :addresses => { '_id' => address.id } } },
          :multi => true)
    end
    

    这不会运行任何回调。如果你需要任何回调,你应该使用shingara的方法,但将delete替换为destroy

    【讨论】:

    • 这没有做任何事情。我什至试过User.where('addresses._id' => address.id),它返回nil。就像没有看到嵌入的文档一样。
    • @Goalie 如果您没有为地址设置自定义 ID 并让 mongo 设置 ID,那么所有文档都不会具有相同的 ID(即使是嵌入的)。您必须有其他方法来识别两个地址是否相同。您应该使用它而不是 'addresses._id' => address.id
    猜你喜欢
    • 1970-01-01
    • 2014-03-20
    • 2011-07-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多