如何使用Mongoid的许多嵌入式文档update_all(带有where子句)?

时间:2012-02-08 20:45:47

标签: ruby-on-rails mongodb mongoid

我有一个Item类和一个Comment类。项目有很多嵌入式评论。

评论还会存储用户的用户名,因此如果用户更改了用户名,我想更新他们的所有评论。

我想做这样的事情(显然它不起作用):

Item.where('comments.username' => 'elvis33').update_all('comments.username' => 'elvis')

我该怎么做?

2 个答案:

答案 0 :(得分:2)

$ positional operator有限制only applies to the first matched item in the queryJira中存在一个关于该问题的未解决问题(如果您确实需要该功能,请投票)

因此除了检索评论集合并通过循环更新所有评论之外别无选择。

items = Item.only(:comments).where('comments.username' => 'elvis33')
items.each do |item|
    item.comments.select {|com| com.username == 'elvis33'}.each do |comment|
       comment.username = 'elvis'
    end
item.save
end

以上代码使用所有修改后的注释用户名更新每个项目一次。我没有测试过代码。

答案 1 :(得分:0)

由于用户名实际上是嵌入式数组文档的一部分,因此您必须使用positional operator,如下所示:

Item.where('comments.username'=>'elvis33')。update_all('comments。$ .username'=>'elvis')