我正试图找到一种使用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"]
}
我如何实现这一目标?
答案 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