使用mongoid

时间:2016-03-09 23:20:40

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

我正试图找到一种使用mongoid更新单个数组项的方法。我正在使用Rails 4和Mongodb。

我的模型看起来像这样

class User
  include Mongoid::Document
  include Mongoid::Timestamps

field :my_book_list, type: Array, default: []
field :book_name, type: String

我可以使用以下代码向数组字段添加条目:

User.where(id: self.user_id).add_to_set("my_book_list" => self.book_name)

在我向数组添加数据后,在数据库中它看起来像这样

db.collection.users 
{
    "_id" : ObjectId("56e09d54a0d00b0528000001"),
    "status" : true,
    "sign_in_count" : 3,
    "my_book_list" : 
     ["Learning Ruby", "MongoDB for Dummies"]

}

我正在努力寻找一种Rails / Mongoid方法,通过查找名称来更新数组中项目的值。

简单地说,如何通过名称搜索my_book_list [1]并且不知道其索引来更改my_book_list [1]的值。在这种情况下,索引1是“MongoDB for Dummies”,需要更新为“MongoDB”。这样“my_book_list”数组字段在更新后会如下所示:

db.collection.users 
{
    "_id" : ObjectId("56e09d54a0d00b0528000001"),
    "status" : true,
    "sign_in_count" : 3,
    "my_book_list" : 
     ["Learning Ruby", "MongoDB"]

}

我如何实现这一目标?

2 个答案:

答案 0 :(得分:1)

而不是更新,将其视为添加&除去。您可以使用pull(https://docs.mongodb.org/ecosystem/tutorial/mongoid-persistence/#atomic

如果您的添加集唯一地将其添加到数组,则pull会根据名称将其删除。所以假设:

user = User.find_by(id: self.user_id)

user.add_to_set(my_book_list: 'First Story')
p user.my_book_list
=> ['First Story']

user.add_to_set(my_book_list: 'Second Story')
p user.my_book_list
=> ['First Story', 'Second Story']

user.add_to_set(my_book_list: 'Third Story')
p user.my_book_list
=> ['First Story', 'Second Story', 'Third Story']

user.pull(my_book_list: 'Second Story')
p user.my_book_list
=> ['First Story', 'Third Story']

如果你在集合中有重复项,你可以使用pull_all,但是你使用add来设置,所以你不需要。

答案 1 :(得分:0)

这更像是一个红宝石初学者的概念问题。答案是mongo数组是简单的ruby数组,我们可以使用标准的ruby方法来更新数组。

在这种情况下,在我的rails控制台中,我做到了这一点并且有效。第二行找到数组项并替换为新的wird,

     u = User.first
     u.my_book_list.map! { |x| x == "MongoDB for Dummies" ? "MongoDB": x}
     u.save