使用 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,但您使用的是添加集合,因此不需要。
我正在尝试找到一种使用 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,但您使用的是添加集合,因此不需要。