使用 mongoid 更新数组字段的值

Update value of array field using 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] 的值。在这种情况下,索引 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"]

}

我该如何实现?

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

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

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

与其更新,不如将其视为添加和删除。你可以使用 pull (https://docs.mongodb.org/ecosystem/tutorial/mongoid-persistence/#atomic)

如果您的 add to set 唯一地将其添加到数组,则 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,但您使用的是添加集合,因此不需要。